"""(1) Mean NOAA range width by era; (2) named-storm bias of NOAA midpoints vs naive baselines."""
import csv, numpy as np
obs = {int(r['year']): r for r in csv.DictReader(open('../data/season_counts.csv'))}
noaa = list(csv.DictReader(open('../data/noaa_outlooks.csv')))
for k in ('ns', 'h', 'mh'):
    for era, f in (('2001-07', lambda y: y < 2008), ('2008-25', lambda y: y >= 2008)):
        w = [int(r[k + '_hi']) - int(r[k + '_lo']) for r in noaa if f(int(r['year']))]
        print(f'{k} {era} mean width {np.mean(w):.1f}', end='   ')
    print()
w = [float(r['ace_hi_pct']) - float(r['ace_lo_pct']) for r in noaa if r['ace_lo_pct']]
print('ACE width (% median) 2003-07', np.mean([float(r['ace_hi_pct']) - float(r['ace_lo_pct']) for r in noaa if r['ace_lo_pct'] and int(r['year']) < 2008]),
      '2008-25', np.mean([float(r['ace_hi_pct']) - float(r['ace_lo_pct']) for r in noaa if int(r['year']) >= 2008]))
ys = range(2001, 2026)
for k in ('ns', 'h', 'mh'):
    v = np.array([int(obs[y][k]) for y in ys])
    b = {'era1995': [np.mean([int(obs[x][k]) for x in range(1995, y)]) for y in ys],
         'trail10': [np.mean([int(obs[x][k]) for x in range(y - 10, y)]) for y in ys],
         'clim30': [np.mean([int(obs[x][k]) for x in range(y - 30, y)]) for y in ys]}
    nm = {m: np.mean([(int(r[k + '_lo']) + int(r[k + '_hi'])) / 2 - int(obs[int(r['year'])][k]) for r in noaa if r['month'] == m]) for m in ('May', 'Aug')}
    print(k, 'bias: NOAA May %+.2f Aug %+.2f |' % (nm['May'], nm['Aug']), ' '.join(f'{n} {np.mean(np.array(x) - v):+.2f}' for n, x in b.items()))
