from design import *
import numpy as np
g=pd.read_parquet(R/'classified.parquet');g['day']=g.first_date.map(lambda d:d.timestamp()/86400)
rows=[]
for period in ['2023_2025','2026_JanAug']:
 base=g[g.period.eq(period)];window=30 if period=='2026_JanAug' else 90
 for host in HOSTS:
  pool=base[base['host10_'+host]&base['text_'+host]];b=pool[pool.strict]
  c=pool[~pool.strict][['appid','developer_id','price_bucket','text_bin','day','reviews']]
  n=obs=0;exp=0.
  for a in b[['appid','developer_id','price_bucket','text_bin','day','reviews']].itertuples():
   mask=c.price_bucket.fillna('missing').eq(a.price_bucket if pd.notna(a.price_bucket) else 'missing')&c.text_bin.eq(a.text_bin)&c.developer_id.ne(a.developer_id)&c.day.sub(a.day).abs().le(window)
   peers=c[mask].copy();peers['distance']=peers.day.sub(a.day).abs();peers=peers.sort_values(['distance','appid']).head(5)
   if len(peers)<3:continue
   n+=1;obs+=int(a.reviews>=100);exp+=float(peers.reviews.ge(100).mean())
  rows.append(dict(period=period,host=host,build_n=len(b),supported_n=n,observed100=obs,expected100=exp,ratio100=obs/exp if exp else None))
pd.DataFrame(rows).to_csv(R/'matched_text_length.csv',index=False)
print(pd.DataFrame(rows).query("period == '2023_2025'").round(3).to_string(index=False))
