#!/usr/bin/env python3 import sys import subprocess import os # === AUTO INSTALL === def ensure(pkg): try: __import__(pkg) except ImportError: subprocess.check_call([sys.executable, "-m", "pip", "install", pkg]) ensure("pandas") ensure("matplotlib") import pandas as pd import matplotlib.pyplot as plt # === ARGS === if len(sys.argv) < 2: print("Usage: python graph.py data.csv [output_dir]") sys.exit(1) FILE = sys.argv[1] OUTDIR = sys.argv[2] if len(sys.argv) > 2 else "graphs" os.makedirs(OUTDIR, exist_ok=True) # === LOAD === df = pd.read_csv(FILE) required_cols = ["datetime", "profit", "buy_in"] for col in required_cols: if col not in df.columns: print(f"Missing column: {col}") sys.exit(1) df["datetime"] = pd.to_datetime(df["datetime"], errors="coerce") df = df.dropna(subset=["datetime"]) df = df.sort_values("datetime") # === CLEAN NUMERIC === df["profit"] = pd.to_numeric(df["profit"], errors="coerce").fillna(0) df["buy_in"] = pd.to_numeric(df["buy_in"], errors="coerce").fillna(0) # === CUMULATIVE PROFIT === df["cum_profit"] = df["profit"].cumsum() plt.figure() plt.plot(df["datetime"], df["cum_profit"]) plt.title("Cumulative Profit") plt.xlabel("Time") plt.ylabel("€") plt.xticks(rotation=45) plt.tight_layout() plt.savefig(f"{OUTDIR}/cum_profit.png") plt.close() # === PROFIT PER GAME === plt.figure() plt.scatter(range(len(df)), df["profit"]) plt.title("Profit per Game") plt.xlabel("Game #") plt.ylabel("€") plt.tight_layout() plt.savefig(f"{OUTDIR}/profit_scatter.png") plt.close() # === ROI BY CATEGORY (SAFE) === if "category" in df.columns: df_valid = df[df["buy_in"] > 0] if not df_valid.empty: roi = df_valid.groupby("category").apply( lambda x: x["profit"].sum() / x["buy_in"].sum() ) plt.figure() roi.plot(kind="bar") plt.title("ROI by Category") plt.xlabel("Category") plt.ylabel("ROI") plt.tight_layout() plt.savefig(f"{OUTDIR}/roi_category.png") plt.close() # === SESSION PERFORMANCE === if "session" in df.columns: session_profit = df.groupby("session")["profit"].sum() plt.figure() session_profit.plot(kind="bar") plt.title("Profit by Session") plt.xlabel("Session") plt.ylabel("€") plt.tight_layout() plt.savefig(f"{OUTDIR}/session_profit.png") plt.close() # === POSITION DISTRIBUTION === if "position" in df.columns: pos_counts = df["position"].value_counts() plt.figure() pos_counts.plot(kind="bar") plt.title("Position Distribution") plt.xlabel("Position") plt.ylabel("Count") plt.tight_layout() plt.savefig(f"{OUTDIR}/positions.png") plt.close() print(f"✅ Graphs saved in: {OUTDIR}")