{
 "status": "ok",
 "sport": "mlb",
 "caveat": "Descriptive data-coverage showcase only -- pitch-type mix, velo percentiles, and column completeness for the local 2025 statcast pull. Does NOT recompute any predictive-validity result. No advantage/return/money claim.",
 "source": "data/cache/statcast/statcast_fuller__2025.parquet",
 "n_pitches": 693037,
 "pitch_type_distribution": [
  {
   "pitch_type": "FF",
   "n": 220235,
   "pct": 31.78
  },
  {
   "pitch_type": "SI",
   "n": 107136,
   "pct": 15.46
  },
  {
   "pitch_type": "SL",
   "n": 99357,
   "pct": 14.34
  },
  {
   "pitch_type": "CH",
   "n": 71270,
   "pct": 10.28
  },
  {
   "pitch_type": "ST",
   "n": 52681,
   "pct": 7.6
  },
  {
   "pitch_type": "FC",
   "n": 51867,
   "pct": 7.48
  },
  {
   "pitch_type": "CU",
   "n": 46489,
   "pct": 6.71
  },
  {
   "pitch_type": "FS",
   "n": 22473,
   "pct": 3.24
  },
  {
   "pitch_type": "KC",
   "n": 12412,
   "pct": 1.79
  },
  {
   "pitch_type": "SV",
   "n": 3427,
   "pct": 0.49
  },
  {
   "pitch_type": "UNK",
   "n": 2544,
   "pct": 0.37
  },
  {
   "pitch_type": "EP",
   "n": 970,
   "pct": 0.14
  },
  {
   "pitch_type": "FA",
   "n": 854,
   "pct": 0.12
  },
  {
   "pitch_type": "FO",
   "n": 721,
   "pct": 0.1
  },
  {
   "pitch_type": "CS",
   "n": 393,
   "pct": 0.06
  },
  {
   "pitch_type": "KN",
   "n": 135,
   "pct": 0.02
  },
  {
   "pitch_type": "PO",
   "n": 53,
   "pct": 0.01
  },
  {
   "pitch_type": "UN",
   "n": 13,
   "pct": 0.0
  },
  {
   "pitch_type": "SC",
   "n": 7,
   "pct": 0.0
  }
 ],
 "velo_percentiles_by_pitch_type": [
  {
   "pitch_type": "FF",
   "n": 220233,
   "p10": 91.3,
   "p50": 94.5,
   "p90": 97.7
  },
  {
   "pitch_type": "SI",
   "n": 107135,
   "p10": 90.3,
   "p50": 94.0,
   "p90": 97.2
  },
  {
   "pitch_type": "SL",
   "n": 99357,
   "p10": 82.7,
   "p50": 86.4,
   "p90": 89.7
  },
  {
   "pitch_type": "CH",
   "n": 71270,
   "p10": 80.5,
   "p50": 86.3,
   "p90": 90.1
  },
  {
   "pitch_type": "ST",
   "n": 52681,
   "p10": 78.7,
   "p50": 82.7,
   "p90": 86.2
  },
  {
   "pitch_type": "FC",
   "n": 51867,
   "p10": 86.0,
   "p50": 89.6,
   "p90": 93.3
  },
  {
   "pitch_type": "CU",
   "n": 46489,
   "p10": 75.1,
   "p50": 79.9,
   "p90": 83.9
  },
  {
   "pitch_type": "FS",
   "n": 22473,
   "p10": 82.2,
   "p50": 86.3,
   "p90": 90.9
  },
  {
   "pitch_type": "KC",
   "n": 12412,
   "p10": 77.6,
   "p50": 83.0,
   "p90": 87.5
  },
  {
   "pitch_type": "SV",
   "n": 3427,
   "p10": 78.6,
   "p50": 81.8,
   "p90": 85.0
  },
  {
   "pitch_type": "EP",
   "n": 970,
   "p10": 38.9,
   "p50": 50.1,
   "p90": 60.3
  },
  {
   "pitch_type": "FA",
   "n": 854,
   "p10": 58.5,
   "p50": 67.9,
   "p90": 79.8
  },
  {
   "pitch_type": "FO",
   "n": 721,
   "p10": 80.9,
   "p50": 83.0,
   "p90": 85.6
  },
  {
   "pitch_type": "CS",
   "n": 393,
   "p10": 52.3,
   "p50": 72.4,
   "p90": 74.9
  },
  {
   "pitch_type": "KN",
   "n": 135,
   "p10": 56.8,
   "p50": 77.4,
   "p90": 83.0
  },
  {
   "pitch_type": "PO",
   "n": 53,
   "p10": 85.7,
   "p50": 91.4,
   "p90": 94.9
  }
 ],
 "framing_ingredient_coverage": [
  {
   "column": "plate_x",
   "non_null_pct": 99.63
  },
  {
   "column": "plate_z",
   "non_null_pct": 99.63
  },
  {
   "column": "sz_top",
   "non_null_pct": 99.63
  },
  {
   "column": "sz_bot",
   "non_null_pct": 99.63
  },
  {
   "column": "zone",
   "non_null_pct": 99.63
  },
  {
   "column": "type",
   "non_null_pct": 100.0
  },
  {
   "column": "fielder_2",
   "non_null_pct": 100.0
  },
  {
   "column": "balls",
   "non_null_pct": 100.0
  },
  {
   "column": "strikes",
   "non_null_pct": 100.0
  }
 ],
 "framing_claim_context": {
  "status": "ok",
  "source": "data/cache/predictive_validity/mlb_framing__borderline_called_strike_rate_asof.json",
  "verdict": "PREDICTIVE_VERIFIED",
  "mean_rho_metric": 0.4178038586805298,
  "mean_rho_baseline": 0.2716927633346492,
  "n_folds": 8,
  "sign_holds_folds": 7,
  "caveat": "CORPUS DEVIATION: statcast_fuller__2022/2023 has no `description` column, so borderline called-strike rate is recomputed here via prereg_shift_framing.py's real build_taken_pitches/classify_borderline/load_savant on savant_full__2023/2024.parquet (the same corpus+functions mlb_framing_claims already uses) -- cutoffs shifted one season (2023/2024, not 2022/2023) to match data that exists. baseline = plain called-strike rate over ALL taken pitches (not just borderline), a declared naive non-borderline-aware proxy, not a trailing mean of the same outcome.",
  "honest_note": "predictive-validity comparison only, against a declared naive baseline at the metric's natural grain, NOT vs the closing reference forecast close; DESCRIPTIVE_ONLY/UNDERPOWERED is a recorded honest outcome, not a failure",
  "cited_as": "context only -- this showcase does not recompute the rho above"
 }
}