from pathlib import Path
import pandas as pd,numpy as np,math
R=Path(__file__).resolve().parent
def stats(d,threshold=1000):
    n=len(d);k=int(d.reviews.ge(threshold).sum());p=k/n if n else np.nan
    den=1+3.8416/n if n else np.nan;center=(p+1.9208/n)/den if n else np.nan;half=1.96*math.sqrt(p*(1-p)/n+.9604/n**2)/den if n else np.nan
    return dict(n=n,strong=k,strong_rate=p,lo95=center-half,hi95=center+half,atleast100=int(d.reviews.ge(100).sum()),atleast100_rate=d.reviews.ge(100).mean(),median_reviews=d.reviews.median(),median_price=d.price.median())
def compare(a,b,keys,outcome='strong',min_n=5):
    ref=b.groupby(keys,dropna=False,observed=True)[outcome].agg(['mean','size']).reset_index();ref=ref[ref['size']>=min_n]
    z=a.merge(ref,on=keys,how='inner');obs=int(z[outcome].sum());exp=float(z['mean'].sum())
    return dict(supported=len(z),support_rate=len(z)/len(a) if len(a) else np.nan,observed=obs,expected=exp,oe=obs/exp if exp else np.nan)
def save(rows,name):pd.DataFrame(rows).to_csv(R/name,index=False)
