56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
"""
|
|
update_ranking_and_anomalies.py
|
|
Synchronizes all multi-platform metrics through HIFFIRankingEngine.
|
|
Re-computes XP scores, dynamic weights, statistical anomaly flags, and published ranks.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
import pandas as pd
|
|
|
|
from core.ranking_engine import HIFFIRankingEngine
|
|
|
|
DATA_PATH = Path("data/hiffi_multiplatform_500.csv")
|
|
|
|
|
|
def run_ranking_update():
|
|
if not DATA_PATH.exists():
|
|
print(f"File not found: {DATA_PATH}")
|
|
return
|
|
|
|
df = pd.read_csv(DATA_PATH)
|
|
print(f"Loaded master dataset with {len(df)} artists.")
|
|
|
|
engine = HIFFIRankingEngine()
|
|
|
|
print("[1/4] Calculating baseline production rankings...")
|
|
df = engine.score_and_rank(df)
|
|
|
|
print("[2/4] Computing HIFFI-XP composite scores & dynamic weight redistribution...")
|
|
df = engine.calculate_hiffi_xp(df)
|
|
|
|
print("[3/4] Running statistical anomaly detection...")
|
|
df = engine.detect_metric_anomalies(df)
|
|
|
|
print("[4/4] Applying publication eligibility gates & tier constraints...")
|
|
df = engine.apply_publication_eligibility_gates(df)
|
|
|
|
# Clean display types
|
|
if "hiffi_xp_published_rank" in df.columns:
|
|
df["hiffi_xp_published_rank"] = df["hiffi_xp_published_rank"].astype(int)
|
|
|
|
df.to_csv(DATA_PATH, index=False)
|
|
|
|
anomaly_counts = (df["anomaly_flags"] != "CLEAN").sum()
|
|
tier_counts = df["platform_evidence_tier"].value_counts().to_dict()
|
|
|
|
print("\n==========================================")
|
|
print("Multi-Platform Ranking & Anomaly Sync Complete!")
|
|
print(f"Evidence Tiers Distribution: {tier_counts}")
|
|
print(f"Statistical Anomalies Detected: {anomaly_counts} (Auditable Outliers)")
|
|
print(f"Clean Normal Records: {len(df) - anomaly_counts}")
|
|
print(f"Master CSV updated: {DATA_PATH}")
|
|
print("==========================================")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
run_ranking_update() |