{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# monthly_import_demand.py\n",
    "\n",
    "월별 맥주 수요 — 종량세기(2020.12~) 국산/수입 자체·교차 탄력성\n",
    " 수입: 한국은행 수입물량지수(403Y004 맥주)·수입물가지수(401Y017 맥주), 월별\n",
    " 국산: 카스(오비맥주) 월별 물량·출고가 (국산코어 대표) + PPI 맥주(국산 생산자가)\n",
    " 단일방정식 이중로그 수요(자체·교차가격, 계절·추세·코로나 통제) → n≈60개월\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "\"\"\"월별 맥주 수요 — 종량세기(2020.12~) 국산/수입 자체·교차 탄력성\n",
    " 수입: 한국은행 수입물량지수(403Y004 맥주)·수입물가지수(401Y017 맥주), 월별\n",
    " 국산: 카스(오비맥주) 월별 물량·출고가 (국산코어 대표) + PPI 맥주(국산 생산자가)\n",
    " 단일방정식 이중로그 수요(자체·교차가격, 계절·추세·코로나 통제) → n≈60개월\n",
    "\"\"\"\n",
    "import sys,io,json,urllib.request\n",
    "sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')\n",
    "import numpy as np, pandas as pd, statsmodels.formula.api as smf\n",
    "S=json.load(open(r'C:/Users/meals/.secret/ENVIRONMENT_VARIABLES.json',encoding='utf-8'))['data_api_keys']\n",
    "k=S['API_KEY_BOK']; B='C:/Temp/주류세/공개데이터'\n",
    "\n",
    "def ecos(code,item,cyc='M',s='202012',e='202512'):\n",
    "    url=f'https://ecos.bok.or.kr/api/StatisticSearch/{k}/json/kr/1/1000/{code}/{cyc}/{s}/{e}/{item}'\n",
    "    d=json.loads(urllib.request.urlopen(url,timeout=40).read().decode('utf-8'))\n",
    "    rows=d['StatisticSearch']['row']\n",
    "    return pd.DataFrame({'ym':[int(x['TIME']) for x in rows],'v':[float(x['DATA_VALUE']) for x in rows]})\n",
    "\n",
    "qimp=ecos('403Y004','301213AA').rename(columns={'v':'q_imp'}).groupby('ym',as_index=False).q_imp.mean()   # 수입물량지수 맥주\n",
    "pimp=ecos('401Y017','30121301AA').rename(columns={'v':'p_imp'}).groupby('ym',as_index=False).p_imp.mean() # 수입물가지수 맥주\n",
    "print('수입물량지수 맥주:',len(qimp),'개월',qimp.ym.min(),'~',qimp.ym.max())\n",
    "\n",
    "# 국산: 카스 + PPI맥주\n",
    "cass=pd.read_csv(B+'/DART/cass_monthly.csv'); cass['ym']=cass.year*100+cass.month\n",
    "ppi=pd.read_csv(B+'/한국은행_ECOS/PPI_품목별_소주맥주_200601_202512.csv')\n",
    "ppi=ppi[ppi.품목=='맥주'][['시점','값']].rename(columns={'시점':'ym','값':'p_dom_ppi'}).groupby('ym',as_index=False).p_dom_ppi.mean()\n",
    "cass=cass.groupby('ym',as_index=False).agg(volume=('volume','sum'),price500=('price500','mean'))\n",
    "\n",
    "m=qimp.merge(pimp,on='ym').merge(cass[['ym','volume','price500']],on='ym',how='left').merge(ppi,on='ym',how='left')\n",
    "m=m.rename(columns={'volume':'q_dom','price500':'p_dom_cass'}).sort_values('ym').reset_index(drop=True)\n",
    "m['month']=m.ym%100; m['t']=np.arange(len(m)); m['covid']=(m.ym//100).isin([2020,2021]).astype(int)\n",
    "for c in ['q_imp','p_imp','q_dom','p_dom_ppi','p_dom_cass']: m['ln_'+c]=np.log(m[c])\n",
    "m=m.dropna(subset=['ln_q_imp','ln_p_imp','ln_q_dom','ln_p_dom_ppi'])\n",
    "print('추정 표본:',len(m),'개월',int(m.ym.min()),'~',int(m.ym.max()))\n",
    "\n",
    "def demand(dep,own,cross,label):\n",
    "    f=f'{dep} ~ {own} + {cross} + C(month) + t + covid'\n",
    "    r=smf.ols(f,data=m).fit(cov_type='HAC',cov_kwds={'maxlags':4})\n",
    "    print(f'\\n[{label}] n={int(r.nobs)}')\n",
    "    print(f'  자체가격탄력성={r.params[own]:+.2f} (t={r.tvalues[own]:.2f})')\n",
    "    print(f'  교차가격탄력성={r.params[cross]:+.2f} (t={r.tvalues[cross]:.2f})')\n",
    "    return r\n",
    "print('\\n===== 월별 수요 (종량세기 2020.12~, HAC 표준오차) =====')\n",
    "ri=demand('ln_q_imp','ln_p_imp','ln_p_dom_ppi','수입맥주(물량지수)  자체=수입물가·교차=국산PPI')\n",
    "rd=demand('ln_q_dom','ln_p_dom_cass','ln_p_imp','국산맥주(카스물량)  자체=카스출고가·교차=수입물가')\n",
    "\n",
    "out=dict(period=f'{int(m.ym.min())}-{int(m.ym.max())}',n=int(len(m)),\n",
    "  imp_own=round(float(ri.params['ln_p_imp']),3), imp_cross_dom=round(float(ri.params['ln_p_dom_ppi']),3),\n",
    "  dom_own=round(float(rd.params['ln_p_dom_cass']),3), dom_cross_imp=round(float(rd.params['ln_p_imp']),3))\n",
    "json.dump(out,open(B+'/문헌/monthly_import_demand.json','w',encoding='utf-8'),ensure_ascii=False,indent=2)\n",
    "m.to_csv(B+'/문헌/monthly_beer_demand_data.csv',index=False,encoding='utf-8-sig')\n",
    "print('\\n저장: 문헌/monthly_import_demand.json, monthly_beer_demand_data.csv')\n",
    "print(json.dumps(out,ensure_ascii=False))\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}