""" 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