# -*- coding: utf-8 -*-
"""월별 맥주 수요 — 종량세기(2020.12~) 국산/수입 자체·교차 탄력성
 수입: 한국은행 수입물량지수(403Y004 맥주)·수입물가지수(401Y017 맥주), 월별
 국산: 카스(오비맥주) 월별 물량·출고가 (국산코어 대표) + PPI 맥주(국산 생산자가)
 단일방정식 이중로그 수요(자체·교차가격, 계절·추세·코로나 통제) → n≈60개월
"""
import sys,io,json,urllib.request
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
import numpy as np, pandas as pd, statsmodels.formula.api as smf
S=json.load(open(r'C:/Users/meals/.secret/ENVIRONMENT_VARIABLES.json',encoding='utf-8'))['data_api_keys']
k=S['API_KEY_BOK']; B='C:/Temp/주류세/공개데이터'

def ecos(code,item,cyc='M',s='202012',e='202512'):
    url=f'https://ecos.bok.or.kr/api/StatisticSearch/{k}/json/kr/1/1000/{code}/{cyc}/{s}/{e}/{item}'
    d=json.loads(urllib.request.urlopen(url,timeout=40).read().decode('utf-8'))
    rows=d['StatisticSearch']['row']
    return pd.DataFrame({'ym':[int(x['TIME']) for x in rows],'v':[float(x['DATA_VALUE']) for x in rows]})

qimp=ecos('403Y004','301213AA').rename(columns={'v':'q_imp'}).groupby('ym',as_index=False).q_imp.mean()   # 수입물량지수 맥주
pimp=ecos('401Y017','30121301AA').rename(columns={'v':'p_imp'}).groupby('ym',as_index=False).p_imp.mean() # 수입물가지수 맥주
print('수입물량지수 맥주:',len(qimp),'개월',qimp.ym.min(),'~',qimp.ym.max())

# 국산: 카스 + PPI맥주
cass=pd.read_csv(B+'/DART/cass_monthly.csv'); cass['ym']=cass.year*100+cass.month
ppi=pd.read_csv(B+'/한국은행_ECOS/PPI_품목별_소주맥주_200601_202512.csv')
ppi=ppi[ppi.품목=='맥주'][['시점','값']].rename(columns={'시점':'ym','값':'p_dom_ppi'}).groupby('ym',as_index=False).p_dom_ppi.mean()
cass=cass.groupby('ym',as_index=False).agg(volume=('volume','sum'),price500=('price500','mean'))

m=qimp.merge(pimp,on='ym').merge(cass[['ym','volume','price500']],on='ym',how='left').merge(ppi,on='ym',how='left')
m=m.rename(columns={'volume':'q_dom','price500':'p_dom_cass'}).sort_values('ym').reset_index(drop=True)
m['month']=m.ym%100; m['t']=np.arange(len(m)); m['covid']=(m.ym//100).isin([2020,2021]).astype(int)
for c in ['q_imp','p_imp','q_dom','p_dom_ppi','p_dom_cass']: m['ln_'+c]=np.log(m[c])
m=m.dropna(subset=['ln_q_imp','ln_p_imp','ln_q_dom','ln_p_dom_ppi'])
print('추정 표본:',len(m),'개월',int(m.ym.min()),'~',int(m.ym.max()))

def demand(dep,own,cross,label):
    f=f'{dep} ~ {own} + {cross} + C(month) + t + covid'
    r=smf.ols(f,data=m).fit(cov_type='HAC',cov_kwds={'maxlags':4})
    print(f'\n[{label}] n={int(r.nobs)}')
    print(f'  자체가격탄력성={r.params[own]:+.2f} (t={r.tvalues[own]:.2f})')
    print(f'  교차가격탄력성={r.params[cross]:+.2f} (t={r.tvalues[cross]:.2f})')
    return r
print('\n===== 월별 수요 (종량세기 2020.12~, HAC 표준오차) =====')
ri=demand('ln_q_imp','ln_p_imp','ln_p_dom_ppi','수입맥주(물량지수)  자체=수입물가·교차=국산PPI')
rd=demand('ln_q_dom','ln_p_dom_cass','ln_p_imp','국산맥주(카스물량)  자체=카스출고가·교차=수입물가')

out=dict(period=f'{int(m.ym.min())}-{int(m.ym.max())}',n=int(len(m)),
  imp_own=round(float(ri.params['ln_p_imp']),3), imp_cross_dom=round(float(ri.params['ln_p_dom_ppi']),3),
  dom_own=round(float(rd.params['ln_p_dom_cass']),3), dom_cross_imp=round(float(rd.params['ln_p_imp']),3))
json.dump(out,open(B+'/문헌/monthly_import_demand.json','w',encoding='utf-8'),ensure_ascii=False,indent=2)
m.to_csv(B+'/문헌/monthly_beer_demand_data.csv',index=False,encoding='utf-8-sig')
print('\n저장: 문헌/monthly_import_demand.json, monthly_beer_demand_data.csv')
print(json.dumps(out,ensure_ascii=False))
