sales-analysis / src /reports.py
majorine's picture
Upload 15 files
0c76799 verified
Raw
History Blame Contribute Delete
4.86 kB
"""
Report generation module.
"""
import pandas as pd
from datetime import datetime
def generate_summary_report(data, date_range=None):
"""
Generate a text summary report.
"""
sales = data['sales']
dealers = data['dealers']
car_models = data['car_models']
recalls = data['recalls']
total_revenue = sales['Profit'].sum()
total_units = sales['Quantity Sold'].sum()
avg_profit_per_unit = sales['Avg_Profit_Per_Unit'].mean()
top_model = sales.groupby('Model')['Profit'].sum().idxmax()
top_model_revenue = sales.groupby('Model')['Profit'].sum().max()
top_dealer = sales.groupby('Dealer ID')['Profit'].sum().idxmax()
top_dealer_revenue = sales.groupby('Dealer ID')['Profit'].sum().max()
report = f"""
========================================
SALES PERFORMANCE SUMMARY REPORT
========================================
Report Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
OVERALL METRICS:
----------------
Total Revenue: ${total_revenue:,.2f}
Total Units Sold: {total_units:,.0f}
Average Profit per Unit: ${avg_profit_per_unit:,.2f}
Number of Models: {sales['Model'].nunique()}
Number of Dealers: {dealers['Dealer ID'].nunique() if not dealers.empty else 0}
Number of Recalls: {len(recalls):,}
TOP PERFORMERS:
----------------
Best Performing Model: {top_model} (${top_model_revenue:,.2f})
Best Performing Dealer: {top_dealer} (${top_dealer_revenue:,.2f})
DATE RANGE:
----------------
Start Date: {sales['Date'].min().strftime('%Y-%m-%d')}
End Date: {sales['Date'].max().strftime('%Y-%m-%d')}
"""
return report
def generate_model_performance_report(model_performance):
"""
Generate report on model performance.
"""
if model_performance.empty:
return "No model performance data available."
report = "\n MODEL PERFORMANCE REPORT\n " + "=" * 40 + "\n\n"
for idx, row in model_performance.iterrows():
report += f"""
Model: {row['Model']}
- Total Profit: ${row['Profit']:,.2f}
- Total Units Sold: {row['Quantity Sold']:,.0f}
- Avg Profit/Unit: ${row['Avg_Profit_Per_Unit']:,.2f}
- Number of Dealers: {row['Num_Dealers']}
- Profit per Dealer: ${row['Profit_Per_Dealer']:,.2f}
"""
return report
def generate_dealer_performance_report(dealer_performance):
"""
Generate report on dealer performance.
"""
if dealer_performance.empty:
return "No dealer performance data available."
report = "\n DEALER PERFORMANCE REPORT\n " + "=" * 40 + "\n\n"
for idx, row in dealer_performance.iterrows():
dealer_name = row.get('Dealer Name', f"Dealer {row['Dealer ID']}")
report += f"""
{dealer_name} (ID: {row['Dealer ID']})
- Location: {row.get('City', 'N/A')}, {row.get('State', 'N/A')}
- Total Profit: ${row['Profit']:,.2f}
- Total Units Sold: {row['Quantity Sold']:,.0f}
"""
return report
def generate_recalls_report(recalls_impact):
"""
Generate report on recalls impact.
"""
if recalls_impact.empty:
return "No recall data available."
report = "\n RECALLS IMPACT REPORT\n " + "=" * 40 + "\n\n"
for idx, row in recalls_impact.head(10).iterrows():
recall_ratio = row['Recall_Ratio']
impact_level = "HIGH" if recall_ratio > 0.1 else "MEDIUM" if recall_ratio > 0.05 else "LOW"
report += f"""
Model: {row['Model']}
- Recall Units: {row['Recall_Units']:,.0f}
- Total Sales: {row['Quantity Sold']:,.0f}
- Recall Ratio: {recall_ratio:.1%}
- Impact Level: {impact_level}
"""
return report
def export_to_excel(data, filename=None):
"""
Export analysis data to Excel file.
"""
if filename is None:
filename = f"sales_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
with pd.ExcelWriter(filename, engine='openpyxl') as writer:
data['sales'].to_excel(writer, sheet_name='Sales Data', index=False)
if not data.get('model_performance', pd.DataFrame()).empty:
data['model_performance'].to_excel(writer, sheet_name='Model Performance', index=False)
if not data.get('dealer_performance', pd.DataFrame()).empty:
data['dealer_performance'].to_excel(writer, sheet_name='Dealer Performance', index=False)
if not data.get('monthly_trends', pd.DataFrame()).empty:
data['monthly_trends'].to_excel(writer, sheet_name='Monthly Trends', index=False)
if not data.get('yearly_summary', pd.DataFrame()).empty:
data['yearly_summary'].to_excel(writer, sheet_name='Yearly Summary', index=False)
return filename