# -*- coding: utf-8 -*-
"""NIQ 맥주 스캐너(가정용) 월별 2재화 AIDS — 한치록 완전재현 (국산 vs 수입, 2017~2025)
 분류: 브랜드 원산지(국산 대표브랜드 사전, 그 외 수입). 지역브랜드 라이선스생산(버드와이저 등)은 '수입'(원산지), 민감도 별도.
"""
import sys,io,json,os
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
import numpy as np, pandas as pd, statsmodels.formula.api as smf
OUT='C:/Temp/주류세/공개데이터/닐슨'
df=pd.read_csv(OUT+'/_malt_raw.csv')
df['brand']=df.brand.astype(str).str.upper().str.strip()

DOM_EXACT={'HITE','KLOUD','KELLY','MAX','FITZ','HANMAC','JEJU','MALPYO','KOMPYO','KABREW',
           'PLATINUM','STOUT','OB LAGER','THE PREMIER OB','DRY FINISH D','GOMPYO'}
DOM_PREFIX=('CASS','CAFRI','TERRA','FILITE','FILGOOD','HITE','KLOUD','DRY FINISH','OB ',
            'HAND','SEVEN','THE BOOTH','GORILLA','GOLDEN LAGER','QUEX')
# 라이선스 국내생산(원산지는 해외) — 민감도용
LICENSED={'BUDWEISER','HOEGAARDEN','STELLA ARTOIS'}
def origin(b, licensed_as_dom=False):
    if licensed_as_dom and b in LICENSED: return '국산'
    if b in DOM_EXACT or b.startswith(DOM_PREFIX): return '국산'
    return '수입'

def build(licensed_as_dom):
    d=df.copy(); d['grp']=d.brand.map(lambda b:origin(b,licensed_as_dom))
    a=d.groupby(['ym','grp','met']).v.sum().unstack('met').reset_index()
    a['sales']=a['value']*1e6; a['liters']=a['volume']*10; a['price']=a.sales/a.liters
    w=a.pivot(index='ym',columns='grp',values=['sales','liters','price'])
    w.columns=[f'{x}_{y}' for x,y in w.columns]; w=w.reset_index().dropna()
    w['X']=w['sales_국산']+w['sales_수입']; w['w_imp']=w['sales_수입']/w.X; w['w_dom']=1-w.w_imp
    return w

def aids(w,ctrl):
    d=w.copy()
    d['lnP']=d.w_imp*np.log(d['price_수입'])+d.w_dom*np.log(d['price_국산'])
    d['ln_XP']=np.log(d.X)-d.lnP; d['ln_rel']=np.log(d['price_수입']/d['price_국산'])
    d['month']=d.ym%100; d['t']=np.arange(len(d)); d['covid']=(d.ym//100).isin([2020,2021]).astype(int)
    m=smf.ols('w_imp ~ ln_rel + ln_XP'+ctrl,data=d).fit(cov_type='HAC',cov_kwds={'maxlags':6})
    g=m.params['ln_rel']; b=m.params['ln_XP']; wi=d.w_imp.mean(); wd=d.w_dom.mean()
    return dict(gamma=round(g,3),tg=round(m.tvalues['ln_rel'],2),beta=round(b,3),tb=round(m.tvalues['ln_XP'],2),
      e_imp=round(-1+(g-b*wi)/wi,2), e_dom=round(-1+(g+b*wd)/wd,2),
      cross_imp_on_dom=round((-g+b*wi)/wd,2), cross_dom_on_imp=round((-g-b*wd)/wi,2),
      eta_imp=round(1+b/wi,2), eta_dom=round(1-b/wd,2), wi=round(wi,3), n=int(m.nobs))

w=build(False); w.to_csv(OUT+'/beer_niq_dom_imp_monthly.csv',index=False,encoding='utf-8-sig')
print('월별관측',len(w),int(w.ym.min()),'~',int(w.ym.max()))
print('수입 지출몫 w_imp: %.3f(2017초)→%.3f(2025말), 평균 %.3f'%(w.w_imp.iloc[0],w.w_imp.iloc[-1],w.w_imp.mean()))
# 연도별 수입몫
w['yr']=w.ym//100
print('연도별 수입 지출몫:')
print('  '+', '.join('%d:%.1f%%'%(y,g.w_imp.mean()*100) for y,g in w.groupby('yr')))
print('가격 원/L: 국산 %.0f, 수입 %.0f'%(w['price_국산'].mean(),w['price_수입'].mean()))

res={}
for lab,ctrl in [('계절통제',' + C(month)'),('계절+추세+코로나',' + C(month)+t+covid')]:
    r=aids(w,ctrl); res['main_'+lab]=r
    print(f'\n===== AIDS(원산지분류) [{lab}] n={r["n"]} =====')
    print(f'  γ={r["gamma"]}(t={r["tg"]}) β={r["beta"]}(t={r["tb"]})')
    print(f'  자체가격탄력성: 수입 {r["e_imp"]:+} | 국산 {r["e_dom"]:+}')
    print(f'  교차: 국산가↑→수입 {r["cross_imp_on_dom"]:+} · 수입가↑→국산 {r["cross_dom_on_imp"]:+}')
    print(f'  지출탄력성: 수입 {r["eta_imp"]:+} | 국산 {r["eta_dom"]:+} (수입몫 {r["wi"]})')
# 민감도: 라이선스 국내생산을 국산으로
r2=aids(build(True),' + C(month)+t+covid'); res['sens_licensed_as_dom']=r2
print(f'\n[민감도: 버드와이저·호가든·스텔라를 국산 처리] 수입 ε={r2["e_imp"]:+}, 국산 ε={r2["e_dom"]:+}, 수입몫 {r2["wi"]}')
json.dump(res,open(OUT+'/beer_niq_aids.json','w',encoding='utf-8'),ensure_ascii=False,indent=2)
print('\n[대조] 원논문 수입프리미엄 -4.8~-6.0/국산코어 -1.8~-1.9 · 국세접합 수입 -3.6/국산 -1.1')
print('저장: beer_niq_dom_imp_monthly.csv, beer_niq_aids.json')
