---
title: "Create Data Reports Using AI"
description: "Step-by-step guide to generating company sales reports from a CSV file"
---

In this tutorial, we will generate detailed, multi-slide sales data reports for multiple companies using a self-hosted Presenton's API and a Python script.

This tutorial extends [Generate a PPT via API in 5 Minutes](./generate-presentation-over-api) and shows you how to automate the creation of structured sales reports from a CSV file using Python.

So, do check it before continuing with this and make sure you have Presenton running locally or on any server, and you are able to generate presentations with it.

---

## 1. Prepare Your CSV File

Save your sales data as `sales_data.csv`:

```csv
Company,Month,Region,Total Sales,Product A Sales,Product B Sales,Product C Sales,Quarter Target Achieved,Top Sales Rep,New Clients,Client Churn Rate,Growth vs Last Quarter,Marketing Spend,Customer Satisfaction,Notable Events
AcmeCorp,2024-03,North,98000,45000,37000,16000,Yes,Sarah Dee,13,2%,5.5%,11500,8.9,"Launched B2B platform"
AcmeCorp,2024-03,South,76800,30000,39000,7800,Yes,John Lee,9,3%,4.5%,9200,8.3,"New partnership established"
BetaBiz,2024-03,West,82000,22000,47000,13000,No,Monica Tai,7,4%,-1.0%,10900,7.3,"Ad campaign underperformed"
BetaBiz,2024-03,East,94500,40000,41000,13500,Yes,Derek Shah,11,2.2%,7.2%,12400,8.6,"Exceeded upsell targets"
ZenithLtd,2024-03,Central,101300,38000,51200,12000,Yes,Rita Ganesh,14,1.1%,9.6%,13800,9.2,"Record-high client retention"
ZenithLtd,2024-03,East,85450,25000,47000,13450,No,Marcus Bell,8,3.8%,-2.8%,10100,7.9,"Sales dip in Product C"
GammaInc,2024-03,North,91200,39000,43000,9200,Yes,Emily Jones,10,1.5%,6.2%,11800,8.8,"Employee incentive program"
GammaInc,2024-03,Sales Ops,79000,31000,39000,9000,No,David Yu,6,5.5%,-3.2%,8700,7.1,"System migration delayed"
```

---

## 2. Install Python Requirements

You’ll need the `requests` and `pandas` libraries:

```bash
pip install requests pandas
```

---

## 3. Write the Python Script

Let’s build the script step by step.

### a. Import Libraries

```python
import os
import pandas as pd
import requests
```

### b. Create reports directory

```python
os.makedirs('reports', exist_ok=True)
```

### c. Load the CSV

```python
df = pd.read_csv("sales_data.csv")
```

### d. Group Data by Company

```python
company_groups = df.groupby("Company")
```

### e. Define a Function to Build the Prompt

```python
def build_prompt(company, group):
    """
    Build a markdown prompt with data summary, chart instructions, and slide structure.
    """
    summary = []
    regions = group['Region'].unique()
    total_sales = group['Total Sales'].sum()
    total_clients = group['New Clients'].sum()
    churn = group['Client Churn Rate'].mean()
    satisfaction = group['Customer Satisfaction'].mean()
    growth = group['Growth vs Last Quarter'].mean()
    marketing = group['Marketing Spend'].sum()
    notable = "; ".join(group['Notable Events'].unique())

    # Markdown-structured prompt
    prompt = f"""
## Sales Report for {company}

### 1. Executive Summary
- Total sales: **${total_sales:,.0f}**
- Average client churn: **{churn:.2f}%**
- Customer satisfaction: **{satisfaction:.2f}/10**
- Notable events: _{notable}_

### 2. Regional Performance
**Bar Chart:** Regional Total Sales

| Region | Sales |
|---|---|
"""    
    for region in regions:
        reg_sales = group[group['Region'] == region]['Total Sales'].sum()
        prompt += f"| {region} | ${reg_sales:,.0f} |\n"

    prompt += """

### 3. Product Performance
**Bar Chart:** Sales by Product per Region

| Region | Product A | Product B | Product C |
|---|---|---|---|
"""
    for region in regions:
        gr = group[group['Region'] == region]
        a = gr['Product A Sales'].sum()
        b = gr['Product B Sales'].sum()
        c = gr['Product C Sales'].sum()
        prompt += f"| {region} | ${a:,.0f} | ${b:,.0f} | ${c:,.0f} |\n"

    prompt += f"""

### 4. Key Metrics & Trends
- Aggregate new clients this month: **{total_clients}**
- Mean growth vs last quarter: **{growth:.2f}%**
- Total marketing spend: **${marketing:,.0f}**

### 5. Top Performers
| Region | Top Sales Rep | New Clients |
|---|---|---|
"""
    for region in regions:
        gr = group[group['Region'] == region]
        rep = gr['Top Sales Rep'].iloc[0]
        clients = gr['New Clients'].iloc[0]
        prompt += f"| {region} | {rep} | {clients} |\n"

    prompt += """

---

**Instructions:**
- Create 1 slide per section (5 total).
- Use clean, professional visuals.
- For charts, display the specified bar chart with given data.
- Use summary bullet points before every chart or table for clarity.
**Do exactly as in said here.**
"""

    return prompt
```

### f. Loop Over Each Company and Generate a Report

```python
for company, group in company_groups:
    print(f"Generating report for {company}")
    prompt = build_prompt(company, group)
    data = {
        "prompt": prompt,
        "n_slides": "5",
        "language": "English",
        "theme": "light_red",
        "export_as": "pdf"
    }
    response = requests.post(
        "http://localhost:5000/api/v1/ppt/generate/presentation",
        data=data
    )
    if response.ok:
        result = response.json()
        print("Downloading report...")
        download_url = f"http://localhost:5000{result['path']}"
        filename = f"reports/{company}_Sales_Report.pdf"
        file_response = requests.get(download_url)
        if file_response.ok:
            with open(filename, 'wb') as f:
                f.write(file_response.content)
            print(f"Report for {company} saved as {filename}")
        else:
            print(f"Failed to download report for {company}: {file_response.status_code}")
    else:
        print(f"Failed to generate report for {company}: {response.text}")
```

Generated reports will be saved in the `reports` directory.

You may change the URL `http://localhost:5000` to the URL of your Presenton instance.

---

## 4. Run the Script

Save your script as `generate_sales_reports.py` and run:

```bash
python generate_sales_reports.py
```

Each company will get a detailed, multi-slide sales report, and you’ll see the download path for each file in your terminal.

---

## 5. How It Works

- The script reads and groups your CSV by company.
- It builds a well-structured markdown prompt for Presenton’s API (see [API Reference](./generate-presentation-over-api)).
- It sends a POST request to generate a report for each company.
- The API returns a download path for each generated PDF.
- The file is downloaded and saved in the `reports` folder.

---

## 6. Next Steps

- You can further customize the prompt or number of slides as needed.
- For more on API options, see [Generate a PPT via API in 5 Minutes](./generate-presentation-over-api).
- For advanced configuration (for example, using Ollama or GPU), see [Environment Variables](../configurations/environment-variables), [Using GPU](../configurations/using-gpu), and [Using Ollama Models](../configurations/using-ollama-models).

<Info>
  Need help? See the [full documentation](./index) or open an issue on GitHub.
</Info>