127 lines
2.4 KiB
Python
127 lines
2.4 KiB
Python
# compare_snapshots.py
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
#########################################################
|
|
# Utility
|
|
#########################################################
|
|
|
|
def load_json(path):
|
|
return json.loads(Path(path).read_text())
|
|
|
|
def clean_money(val):
|
|
return float(val.replace("$","").replace(",",""))
|
|
|
|
def clean_percent(val):
|
|
return float(val.replace("%",""))
|
|
|
|
#########################################################
|
|
# Extract Scorecard
|
|
#########################################################
|
|
|
|
def extract_scorecard(snapshot_dir):
|
|
|
|
table0 = Path(snapshot_dir)/"tables"/"table_00.json"
|
|
table1 = Path(snapshot_dir)/"tables"/"table_01.json"
|
|
|
|
t0 = load_json(table0)["rows"]
|
|
t1 = load_json(table1)["rows"]
|
|
|
|
metrics = {}
|
|
|
|
for row in t0:
|
|
|
|
name = row[0]
|
|
|
|
projected = row[2]
|
|
|
|
if "Earnings Per Share" in name:
|
|
metrics["EPS"] = clean_money(projected)
|
|
|
|
if "Return On Equity" in name:
|
|
metrics["ROE"] = clean_percent(projected)
|
|
|
|
if "Credit Rating" in name:
|
|
metrics["Credit"] = projected
|
|
|
|
if "Image Rating" in name:
|
|
metrics["Image"] = int(projected)
|
|
|
|
|
|
for row in t1:
|
|
|
|
name = row[0]
|
|
|
|
projected = row[1]
|
|
|
|
if "Net Profit" in name:
|
|
metrics["Profit"] = int(projected.replace(",",""))
|
|
|
|
if "Ending Cash" in name:
|
|
metrics["Cash"] = int(projected.replace(",",""))
|
|
|
|
return metrics
|
|
|
|
|
|
#########################################################
|
|
# Rank Decisions
|
|
#########################################################
|
|
|
|
def score(m):
|
|
|
|
s = 0
|
|
|
|
s += m["EPS"] * 100
|
|
s += m["ROE"] * 5
|
|
s += m["Image"] * 2
|
|
s += m["Cash"] / 1000
|
|
|
|
return s
|
|
|
|
|
|
#########################################################
|
|
# Main
|
|
#########################################################
|
|
|
|
base = Path("captures/Y11 / Round1")
|
|
|
|
snapshots = sorted(base.glob("snapshot_*"))
|
|
|
|
results = []
|
|
|
|
for snap in snapshots:
|
|
|
|
try:
|
|
|
|
m = extract_scorecard(snap)
|
|
|
|
s = score(m)
|
|
|
|
results.append((s,snap.name,m))
|
|
|
|
except Exception as e:
|
|
|
|
print("Skipping",snap.name,e)
|
|
|
|
|
|
|
|
results.sort(reverse=True)
|
|
|
|
|
|
print("\n=== Snapshot Rankings ===\n")
|
|
|
|
|
|
for s,name,m in results:
|
|
|
|
print(name)
|
|
|
|
print(" Score:",round(s,2))
|
|
|
|
print(" EPS:",m["EPS"])
|
|
print(" ROE:",m["ROE"])
|
|
print(" Image:",m["Image"])
|
|
print(" Cash:",m["Cash"])
|
|
print(" Credit:",m["Credit"])
|
|
|
|
print() |