Initial commit: sales analysis template
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
185
run_all_analyses.py
Normal file
185
run_all_analyses.py
Normal file
@@ -0,0 +1,185 @@
|
||||
"""
|
||||
Batch runner for all analysis scripts
|
||||
Runs all analyses in sequence and generates a summary report
|
||||
|
||||
To use:
|
||||
1. Add your analysis scripts to the ANALYSIS_SCRIPTS list below
|
||||
2. Run: python run_all_analyses.py
|
||||
"""
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
import time
|
||||
|
||||
# ============================================================================
|
||||
# CONFIGURATION
|
||||
# ============================================================================
|
||||
|
||||
# List of analysis scripts to run
|
||||
# TODO: Add your analysis scripts here
|
||||
ANALYSIS_SCRIPTS = [
|
||||
# Example structure - customize for your analyses:
|
||||
# 'check_annual_revenue.py',
|
||||
# 'revenue_analysis.py',
|
||||
# 'geographic_analysis.py',
|
||||
# 'customer_segmentation.py',
|
||||
# 'product_analysis.py',
|
||||
# Add your analysis scripts here...
|
||||
]
|
||||
|
||||
# Timeout per script (in seconds)
|
||||
SCRIPT_TIMEOUT = 600 # 10 minutes
|
||||
|
||||
# ============================================================================
|
||||
# HELPER FUNCTIONS
|
||||
# ============================================================================
|
||||
|
||||
def run_script(script_path):
|
||||
"""Run a single analysis script"""
|
||||
script_name = Path(script_path).name
|
||||
print(f"\n{'='*60}")
|
||||
print(f"Running: {script_name}")
|
||||
print(f"{'='*60}")
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
[sys.executable, script_path],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=SCRIPT_TIMEOUT
|
||||
)
|
||||
|
||||
elapsed = time.time() - start_time
|
||||
|
||||
if result.returncode == 0:
|
||||
print(f"✅ {script_name} completed successfully ({elapsed:.1f}s)")
|
||||
if result.stdout:
|
||||
# Print last 10 lines of output
|
||||
lines = result.stdout.strip().split('\n')
|
||||
if len(lines) > 10:
|
||||
print(" ... (output truncated)")
|
||||
for line in lines[-10:]:
|
||||
print(f" {line}")
|
||||
else:
|
||||
for line in lines:
|
||||
print(f" {line}")
|
||||
return True, elapsed, None
|
||||
else:
|
||||
print(f"❌ {script_name} failed ({elapsed:.1f}s)")
|
||||
if result.stderr:
|
||||
print(f" Error: {result.stderr[:500]}")
|
||||
return False, elapsed, result.stderr
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
elapsed = time.time() - start_time
|
||||
print(f"⏱️ {script_name} timed out after {elapsed:.1f}s")
|
||||
return False, elapsed, "Timeout"
|
||||
except Exception as e:
|
||||
elapsed = time.time() - start_time
|
||||
print(f"❌ {script_name} error: {str(e)}")
|
||||
return False, elapsed, str(e)
|
||||
|
||||
# ============================================================================
|
||||
# MAIN FUNCTION
|
||||
# ============================================================================
|
||||
|
||||
def main():
|
||||
"""Run all analysis scripts"""
|
||||
from config import COMPANY_NAME
|
||||
|
||||
print(f"\n{'='*60}")
|
||||
print(f"{COMPANY_NAME} Sales Analysis - Batch Runner")
|
||||
print(f"Started: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
print(f"{'='*60}\n")
|
||||
|
||||
# Check which scripts exist
|
||||
existing_scripts = []
|
||||
missing_scripts = []
|
||||
|
||||
for script in ANALYSIS_SCRIPTS:
|
||||
script_path = Path(script)
|
||||
if script_path.exists():
|
||||
existing_scripts.append(script)
|
||||
else:
|
||||
missing_scripts.append(script)
|
||||
|
||||
if missing_scripts:
|
||||
print(f"⚠️ Warning: {len(missing_scripts)} scripts not found:")
|
||||
for script in missing_scripts:
|
||||
print(f" - {script}")
|
||||
print()
|
||||
|
||||
if not existing_scripts:
|
||||
print("❌ No analysis scripts found!")
|
||||
print(" Please add analysis scripts to ANALYSIS_SCRIPTS list in run_all_analyses.py")
|
||||
return
|
||||
|
||||
print(f"Found {len(existing_scripts)} analysis scripts to run\n")
|
||||
|
||||
# Run scripts
|
||||
results = []
|
||||
total_start = time.time()
|
||||
|
||||
for script in existing_scripts:
|
||||
success, elapsed, error = run_script(script)
|
||||
results.append({
|
||||
'script': script,
|
||||
'success': success,
|
||||
'elapsed': elapsed,
|
||||
'error': error
|
||||
})
|
||||
|
||||
total_elapsed = time.time() - total_start
|
||||
|
||||
# Print summary
|
||||
print(f"\n{'='*60}")
|
||||
print("Batch Run Summary")
|
||||
print(f"{'='*60}\n")
|
||||
|
||||
successful = [r for r in results if r['success']]
|
||||
failed = [r for r in results if not r['success']]
|
||||
|
||||
print(f"Total scripts: {len(results)}")
|
||||
print(f"✅ Successful: {len(successful)}")
|
||||
print(f"❌ Failed: {len(failed)}")
|
||||
print(f"⏱️ Total time: {total_elapsed/60:.1f} minutes\n")
|
||||
|
||||
if failed:
|
||||
print("Failed scripts:")
|
||||
for r in failed:
|
||||
print(f" ❌ {r['script']} ({r['elapsed']:.1f}s)")
|
||||
if r['error']:
|
||||
print(f" Error: {r['error'][:100]}")
|
||||
print()
|
||||
|
||||
# Save summary to file
|
||||
summary_file = Path('analysis_run_summary.txt')
|
||||
with open(summary_file, 'w') as f:
|
||||
f.write(f"{COMPANY_NAME} Sales Analysis - Batch Run Summary\n")
|
||||
f.write(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
|
||||
f.write(f"{'='*60}\n\n")
|
||||
f.write(f"Total scripts: {len(results)}\n")
|
||||
f.write(f"Successful: {len(successful)}\n")
|
||||
f.write(f"Failed: {len(failed)}\n")
|
||||
f.write(f"Total time: {total_elapsed/60:.1f} minutes\n\n")
|
||||
|
||||
if successful:
|
||||
f.write("Successful scripts:\n")
|
||||
for r in successful:
|
||||
f.write(f" ✅ {r['script']} ({r['elapsed']:.1f}s)\n")
|
||||
f.write("\n")
|
||||
|
||||
if failed:
|
||||
f.write("Failed scripts:\n")
|
||||
for r in failed:
|
||||
f.write(f" ❌ {r['script']} ({r['elapsed']:.1f}s)\n")
|
||||
if r['error']:
|
||||
f.write(f" Error: {r['error']}\n")
|
||||
|
||||
print(f"Summary saved to: {summary_file}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user