# -*- coding: utf-8 -*-
"""전체/주종 수준 전가 — (A) 국세 세후 출고가 복원  (B) PPI(세전=원가)→CPI(소비자가) 전이
 요지: PPI는 세전(원가·생산자가) → '원가 proxy'. 출고가(세후)=과표+세금. 소비자가=CPI.
 전가사슬: 원가(PPI) → 출고가(국세 세후) → 소비자가(CPI)
"""
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
B='C:/Temp/주류세/공개데이터'
def num(s): return pd.to_numeric(pd.Series(s).astype(str).str.replace(',',''),errors='coerce')

# ---------- (A) 국세 세후 출고가 복원 (주종별, 연간, 종가세 구간) ----------
print('===== (A) 국세청 기반 세후 출고가 복원 (원/L) =====')
print('  세후출고가 = (과세표준 + 주세 + 교육세0.3×주세 + 부가세0.1×(과표+주세+교육세)) / 출고량')
g=pd.read_csv(B+'/국세청_국세통계/주세신고_주종별_제조수입_2006_2025.csv'); g['값']=num(g['값'])
for 주종 in ['희석식소주','맥주']:
    s=g[(g.주종==주종)&(g.구분=='합계')].pivot_table(index='연도',columns='지표',values='값')
    s=s.rename(columns={'과세표준_종가세':'과표','납부할세액':'주세','출고량':'Q'})
    s=s.dropna(subset=['과표','주세','Q'])
    s=s[s.과표>0]
    s['교육세']=0.3*s.주세; s['부가세']=0.1*(s.과표+s.주세+s.교육세)
    s['출고가_세후_백만원']=s.과표+s.주세+s.교육세+s.부가세
    # 과표·세액 단위=백만원, 출고량=㎘ → 원/L = 백만원*1e6 / (㎘*1000)
    s['출고가_세후_원L']=s['출고가_세후_백만원']*1e6/(s.Q*1000)
    s['세전출고가_원L']=s.과표*1e6/(s.Q*1000)
    s['세금비중']=(s.주세+s.교육세+s.부가세)/s.출고가_세후_백만원
    out=s[['세전출고가_원L','출고가_세후_원L','세금비중']].round(1)
    print(f'\n[{주종}] (종가세 구간)'); print(out.to_string())

# ---------- (B) PPI(원가)→CPI(소비자가) 전이, 월별 ----------
print('\n\n===== (B) PPI(세전=원가) → CPI(소비자가) 전이 회귀, 월별 =====')
cpi=pd.read_csv(B+'/한국은행_ECOS/CPI_품목별_소주맥주_200601_202512.csv')
ppi=pd.read_csv(B+'/한국은행_ECOS/PPI_품목별_소주맥주_200601_202512.csv')
imp=pd.read_csv(B+'/한국은행_ECOS/수입물가_맥주_200601_202512.csv')
imp=imp.groupby('시점',as_index=False).값.mean().rename(columns={'시점':'ym','값':'impp'})
def series(df,item):
    d=df[df.품목==item][['시점','값']].groupby('시점',as_index=False).값.mean()
    return d.rename(columns={'시점':'ym','값':item})
res={}
for 주종 in ['소주','맥주']:
    c=series(cpi,주종).rename(columns={주종:'cpi'}); p=series(ppi,주종).rename(columns={주종:'ppi'})
    m=c.merge(p,on='ym').sort_values('ym')
    if 주종=='맥주': m=m.merge(imp,on='ym',how='left')
    m['ln_cpi']=np.log(m.cpi); m['ln_ppi']=np.log(m.ppi)
    m['d_cpi']=m.ln_cpi.diff(); m['d_ppi']=m.ln_ppi.diff(); m['d_ppi_l1']=m.d_ppi.shift(1)
    if 주종=='맥주': m['d_impp']=np.log(m.impp).diff()
    m=m.dropna(subset=['d_cpi','d_ppi','d_ppi_l1'])
    # 단기 전가(당월) + 누적(당월+1시차)
    f='d_cpi ~ d_ppi + d_ppi_l1'+(' + d_impp' if 주종=='맥주' else '')
    mm=m.dropna(subset=(['d_impp'] if 주종=='맥주' else []))
    r=smf.ols(f,data=mm).fit(cov_type='HAC',cov_kwds={'maxlags':6})
    cum=r.params['d_ppi']+r.params['d_ppi_l1']
    # 장기(수준 공적분형): ln_cpi ~ ln_ppi
    lr=smf.ols('ln_cpi ~ ln_ppi',data=m).fit(cov_type='HAC',cov_kwds={'maxlags':12})
    print(f'\n[{주종}] n={int(r.nobs)}')
    print(f'  단기 전가(당월) β={r.params["d_ppi"]:+.2f} (t={r.tvalues["d_ppi"]:.2f})')
    print(f'  누적 전가(당월+1개월) = {cum:+.2f}')
    print(f'  장기(수준) 탄력 ln_cpi~ln_ppi = {lr.params["ln_ppi"]:+.2f} (t={lr.tvalues["ln_ppi"]:.1f})')
    if 주종=='맥주': print(f'  (수입물가 통제계수 {r.params.get("d_impp",float("nan")):+.2f})')
    res[주종]=dict(n=int(r.nobs),short=round(float(r.params['d_ppi']),3),cum=round(float(cum),3),long=round(float(lr.params['ln_ppi']),3))
json.dump(res,open(B+'/문헌/ppi_cpi_passthrough.json','w',encoding='utf-8'),ensure_ascii=False,indent=2)
print('\n해석: PPI(원가) 상승이 CPI(소비자가)로 전이되는 정도. 1이면 완전전가, <1이면 부분전가/마진흡수.')
print('저장: 문헌/ppi_cpi_passthrough.json')
