# -*- coding: utf-8 -*-
"""NIQ 맥주 브랜드단위 자체가격탄력성 — 수입프리미엄 정밀재현 (MALT 104개월, 가정용)
 논문의 큰 수입 탄력성(−4.8~−6.0)은 '좁은 재화정의(브랜드)'에서 발생(브랜드 전환).
 ln(Q_brand) ~ ln(P_brand) + ln(P_국산코어) + ln(P_타수입) + 계절 + 추세 + 코로나
"""
import sys,io,json
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')
df['dom']=df.brand.map(lambda b: b in DOM_EXACT or b.startswith(DOM_PREFIX))
# 브랜드×월 value/volume
bv=df.pivot_table(index=['brand','ym'],columns='met',values='v',aggfunc='sum').reset_index()
bv['price']=bv['value']*1e6/(bv['volume']*10); bv['liters']=bv['volume']*10
# 국산코어 가격지수 & 수입 가격지수(월별)
agg=df.groupby(['ym','dom','met']).v.sum().unstack('met').reset_index()
agg['price']=agg['value']*1e6/(agg['volume']*10)
pdom=agg[agg.dom].set_index('ym')['price']; pimp=agg[~agg.dom].set_index('ym')['price']
# 대상: 상위 수입 브랜드
IMP_BRANDS=['HEINEKEN','ASAHI','TSINGTAO','BUDWEISER','HOEGAARDEN','KRONENBOURG 1664','STELLA ARTOIS','GUINNESS','KIRIN','SAPPORO']
rows=[]
for b in IMP_BRANDS:
    s=bv[bv.brand==b].copy()
    if len(s)<40: continue
    s['ln_q']=np.log(s.liters); s['ln_p']=np.log(s.price)
    s['ln_pdom']=np.log(s.ym.map(pdom)); s['ln_pimp']=np.log(s.ym.map(pimp))
    s['month']=s.ym%100; s['t']=(s.ym//100-2017)*12+s.ym%100; s['covid']=(s.ym//100).isin([2020,2021]).astype(int)
    try:
        m=smf.ols('ln_q ~ ln_p + ln_pdom + C(month) + t + covid',data=s).fit(cov_type='HAC',cov_kwds={'maxlags':6})
        rows.append((b,len(s),m.params['ln_p'],m.tvalues['ln_p'],m.params.get('ln_pdom',np.nan)))
    except Exception as e: print(b,'ERR',e)
R=pd.DataFrame(rows,columns=['brand','n','own_elast','t','cross_dom'])
print('===== 수입 브랜드단위 자체가격탄력성 (MALT 월별) =====')
print(R.round(2).to_string(index=False))
print('\n  평균 수입브랜드 자체탄력성: %.2f (유의 brand 중앙값 %.2f)'%(R.own_elast.mean(),R[R.t<-1.5].own_elast.median()))
# 비교: 국산 대형 브랜드
for b in ['CASS FRESH','TERRA','HITE','KLOUD']:
    s=bv[bv.brand==b].copy()
    if len(s)<40: continue
    s['ln_q']=np.log(s.liters); s['ln_p']=np.log(s.price); s['ln_pimp']=np.log(s.ym.map(pimp))
    s['month']=s.ym%100; s['t']=(s.ym//100-2017)*12+s.ym%100; s['covid']=(s.ym//100).isin([2020,2021]).astype(int)
    m=smf.ols('ln_q ~ ln_p + ln_pimp + C(month) + t + covid',data=s).fit(cov_type='HAC',cov_kwds={'maxlags':6})
    print('  [국산] %-12s 자체탄력성 %+.2f (t=%.2f, n=%d)'%(b,m.params['ln_p'],m.tvalues['ln_p'],len(s)))
R.round(3).to_csv(OUT+'/beer_niq_brand_elast.csv',index=False,encoding='utf-8-sig')
json.dump({'import_brand_own_elast_mean':round(float(R.own_elast.mean()),2),
           'import_brands':{r.brand:round(r.own_elast,2) for r in R.itertuples()}},
          open(OUT+'/beer_niq_brand_elast.json','w',encoding='utf-8'),ensure_ascii=False,indent=2)
print('\n[원논문] 수입프리미엄 -4.8~-6.0 (브랜드/세그먼트 단위) · 저장: beer_niq_brand_elast.*')
