{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "75831bce",
   "metadata": {},
   "source": [
    "# 01 데이터 입수 — 분기 자료·외생 경로·BOKDPM 기준선·기존 전망\n",
    "\n",
    "**목적.** 5장의 전망·정합화와 전달 산출물 계산에 필요한 입력을 불러오고 검증한다.\n",
    "\n",
    "**2026-10 정비판.** 이전 판은 4장의 바텀업 전망(2026-08-28)과 총량 전망(2026-09-01)을 동결 입력으로 받았다. 정비판은 3장 정비 결과(외생 6종, BOKDPM 기준선)로\n",
    "이 패키지 안에서 바텀업·총량 전망을 다시 계산한다. 계산에 쓰는 명세는 4장에서 선택한 것과 같다(산업 = 차분·산업연관표·VARX, 총량 = 수준·산업연관표·VARX).\n",
    "이전 판 공표 산출물은 `data/published_prev/`에 두고 비교와 이전 판 재현 점검에만 쓴다.\n",
    "\n",
    "| 입력 | 내용 | 출처 |\n",
    "|---|---|---|\n",
    "| `upstream/levels_{36,62,69,agg}.csv` | 산업·총량 분기 실질부가가치(계절조정, 십억 원) | 2장 산출물 |\n",
    "| `upstream/io_linkage_{36,62,69}.csv` | 산업연관 연계 행렬(산업연관표 사전) | 2장 산출물 |\n",
    "| `upstream/exog_hist_v2.csv`, `exog_scen_v2.csv` | 외생 6종 투입형 과거값(2000Q1–2025Q4)과 S1–S5 경로(2026Q1–2035Q4) — **정비판**(실질금리 1차 차분, 인력수급 전망 노동공급, 레버 연결) | 3장 산출물(2026-10 정비) |\n",
    "| `upstream/bokdpm_lgdp_2000_2035.csv` | BOKDPM 실질GDP(100·ln): 과거 평활값 + 기준선 전망(잠재성장률 1.8% 수렴) | 3장 산출물(2026-10 정비) |\n",
    "| `prev_keis_va_62.csv` | 기존 전망(2024–2034판) 62분류 실질부가가치, 2000–2035, 백만 원 | KEIS 전달 엑셀 VA 시트 추출 |\n",
    "| `template_62_VA_v1.xlsx` | 전달 템플릿(62분류 VA, 2000–2034) | KEIS 전달 양식 |\n",
    "| `data/published_prev/` | 이전 판 공표 산출물(바텀업·총량·정합화 전망, 요약·총계, 전달본 값, 카드 자료) | 2026-09-03 공표 |\n",
    "\n",
    "**산출물.** `data/interim/input_check.csv`, `upstream_check.csv`, `prev_total_keis.csv`, `prev_version_totals.csv`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "aaa2e515",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T07:24:14.275873Z",
     "iopub.status.busy": "2026-10-08T07:24:14.275873Z",
     "iopub.status.idle": "2026-10-08T07:24:14.899524Z",
     "shell.execute_reply": "2026-10-08T07:24:14.899018Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python 3.12.10 · pandas 2.2.3 · numpy 2.4.6 · openpyxl 3.1.5 · matplotlib 3.11.0\n",
      "  드리프트 재설정 목표 1.8% · 수축 가중치 w=0.4(이전 판 0.45) · 원본 엑셀 대조: 없음\n",
      "  기존 전망 62     있음  data\\inputs\\prev_keis_va_62.csv\n",
      "  전달 템플릿       있음  data\\inputs\\template_62_VA_v1.xlsx\n",
      "  분기 자료(상류)    있음  data\\inputs\\upstream\n",
      "  정비판 기록       있음  data\\published\n",
      "  이전 판 공표      있음  data\\published_prev\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "os.environ.setdefault(\"OPENBLAS_NUM_THREADS\", \"1\")   # numpy보다 먼저 지정한다(config.py 주석 참조)\n",
    "import json\n",
    "import numpy as np, pandas as pd\n",
    "import config as C\n",
    "import gva_results as R\n",
    "pd.set_option(\"display.float_format\", lambda v: f\"{v:,.3f}\")\n",
    "C.setup()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72836832",
   "metadata": {},
   "source": [
    "## 1. 동결 파일 대조\n",
    "\n",
    "`config.INPUT_SHA256`에 기록한 SHA-256과 현재 파일을 대조한다. 하나라도 다르면 이후 계산 결과를 기록 수치와 비교할 수 없으므로 여기서 멈춘다.\n",
    "원 프로젝트 경로와 수집 경위는 `data/inputs/PROVENANCE.md`에 적었다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "71fe0a58",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T07:24:14.900025Z",
     "iopub.status.busy": "2026-10-08T07:24:14.900025Z",
     "iopub.status.idle": "2026-10-08T07:24:14.922657Z",
     "shell.execute_reply": "2026-10-08T07:24:14.922154Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "대조한 파일 33개 · 일치 33개\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>파일</th>\n",
       "      <th>크기(bytes)</th>\n",
       "      <th>SHA-256(앞 16자리)</th>\n",
       "      <th>일치</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inputs/prev_keis_va_62.csv</td>\n",
       "      <td>122295</td>\n",
       "      <td>3fcdf8dea130b00a</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>inputs/template_62_VA_v1.xlsx</td>\n",
       "      <td>51987</td>\n",
       "      <td>952ddeb5933b7abc</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>inputs/upstream/bokdpm_lgdp_2000_2035.csv</td>\n",
       "      <td>3857</td>\n",
       "      <td>47988ac9d5959298</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>inputs/upstream/exog_hist_v2.csv</td>\n",
       "      <td>5521</td>\n",
       "      <td>d142ff2992b5ae3e</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>inputs/upstream/exog_scen_v2.csv</td>\n",
       "      <td>11096</td>\n",
       "      <td>f45f8007d7b88faf</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>inputs/upstream/io_linkage_36.csv</td>\n",
       "      <td>11035</td>\n",
       "      <td>cf11efc744586d35</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>inputs/upstream/io_linkage_62.csv</td>\n",
       "      <td>67817</td>\n",
       "      <td>3f747a97c3804541</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>inputs/upstream/io_linkage_69.csv</td>\n",
       "      <td>79382</td>\n",
       "      <td>1f57d01c6867b456</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                          파일  크기(bytes)   SHA-256(앞 16자리)  \\\n",
       "0                 inputs/prev_keis_va_62.csv     122295  3fcdf8dea130b00a   \n",
       "1              inputs/template_62_VA_v1.xlsx      51987  952ddeb5933b7abc   \n",
       "2  inputs/upstream/bokdpm_lgdp_2000_2035.csv       3857  47988ac9d5959298   \n",
       "3           inputs/upstream/exog_hist_v2.csv       5521  d142ff2992b5ae3e   \n",
       "4           inputs/upstream/exog_scen_v2.csv      11096  f45f8007d7b88faf   \n",
       "5          inputs/upstream/io_linkage_36.csv      11035  cf11efc744586d35   \n",
       "6          inputs/upstream/io_linkage_62.csv      67817  3f747a97c3804541   \n",
       "7          inputs/upstream/io_linkage_69.csv      79382  1f57d01c6867b456   \n",
       "\n",
       "     일치  \n",
       "0  True  \n",
       "1  True  \n",
       "2  True  \n",
       "3  True  \n",
       "4  True  \n",
       "5  True  \n",
       "6  True  \n",
       "7  True  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rows = []\n",
    "for rel, h in C.INPUT_SHA256.items():\n",
    "    p = os.path.join(C.DATA, rel)\n",
    "    got = R.sha256(p) if os.path.exists(p) else \"\"\n",
    "    rows.append({\"파일\": rel, \"크기(bytes)\": os.path.getsize(p) if got else 0, \"SHA-256(앞 16자리)\": got[:16], \"일치\": got == h})\n",
    "chk = pd.DataFrame(rows)\n",
    "chk.to_csv(os.path.join(C.INTERIM, \"input_check.csv\"), index=False, encoding=\"utf-8-sig\")\n",
    "print(f\"대조한 파일 {len(chk)}개 · 일치 {int(chk['일치'].sum())}개\")\n",
    "assert chk[\"일치\"].all(), \"SHA-256이 다른 파일이 있다: \" + \", \".join(chk.loc[~chk[\"일치\"], \"파일\"])\n",
    "chk.head(8)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "def75858",
   "metadata": {},
   "source": [
    "## 2. 분기 자료와 외생 경로\n",
    "\n",
    "산업 패널은 표본 2000Q1–2025Q4(104분기)를 쓴다. 62·69분류는 36분류를 세분한 것이므로 분기별 산업 합계가 세 분류에서 같아야 한다.\n",
    "외생 6종의 과거값은 104분기, 시나리오 경로는 S1–S5 × 40분기이며 결측이 없어야 한다. BOKDPM 실질GDP는 2000Q1–2035Q4(144분기)이다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5fcbf982",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T07:24:14.923159Z",
     "iopub.status.busy": "2026-10-08T07:24:14.923159Z",
     "iopub.status.idle": "2026-10-08T07:24:14.953286Z",
     "shell.execute_reply": "2026-10-08T07:24:14.953286Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "분기 산업 합계의 분류 간 최대 차이: 3.5e-10십억 원\n",
      "BOKDPM 실질GDP 연간 증가율(%): 2025 1.83, 2026 2.19, 2028 2.24, 2030 1.89, 2035 1.82\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>자료</th>\n",
       "      <th>파일</th>\n",
       "      <th>행</th>\n",
       "      <th>열</th>\n",
       "      <th>첫 행</th>\n",
       "      <th>끝 행</th>\n",
       "      <th>결측</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>levels_36</td>\n",
       "      <td>data\\inputs\\upstream\\levels_36.csv</td>\n",
       "      <td>184</td>\n",
       "      <td>37</td>\n",
       "      <td>1980Q1</td>\n",
       "      <td>2025Q4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>levels_62</td>\n",
       "      <td>data\\inputs\\upstream\\levels_62.csv</td>\n",
       "      <td>104</td>\n",
       "      <td>63</td>\n",
       "      <td>2000Q1</td>\n",
       "      <td>2025Q4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>levels_69</td>\n",
       "      <td>data\\inputs\\upstream\\levels_69.csv</td>\n",
       "      <td>104</td>\n",
       "      <td>70</td>\n",
       "      <td>2000Q1</td>\n",
       "      <td>2025Q4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>levels_agg</td>\n",
       "      <td>data\\inputs\\upstream\\levels_agg.csv</td>\n",
       "      <td>184</td>\n",
       "      <td>2</td>\n",
       "      <td>1980Q1</td>\n",
       "      <td>2025Q4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>io_36</td>\n",
       "      <td>data\\inputs\\upstream\\io_linkage_36.csv</td>\n",
       "      <td>36</td>\n",
       "      <td>36</td>\n",
       "      <td>농림어업</td>\n",
       "      <td>기타 서비스업</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>io_62</td>\n",
       "      <td>data\\inputs\\upstream\\io_linkage_62.csv</td>\n",
       "      <td>62</td>\n",
       "      <td>62</td>\n",
       "      <td>1.농업</td>\n",
       "      <td>62.수리ㆍ개인서비스업</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>io_69</td>\n",
       "      <td>data\\inputs\\upstream\\io_linkage_69.csv</td>\n",
       "      <td>69</td>\n",
       "      <td>69</td>\n",
       "      <td>1.농업</td>\n",
       "      <td>토목건설</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>exog_hist</td>\n",
       "      <td>data\\inputs\\upstream\\exog_hist_v2.csv</td>\n",
       "      <td>104</td>\n",
       "      <td>6</td>\n",
       "      <td>2000Q1</td>\n",
       "      <td>2025Q4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>exog_scen</td>\n",
       "      <td>data\\inputs\\upstream\\exog_scen_v2.csv</td>\n",
       "      <td>200</td>\n",
       "      <td>7</td>\n",
       "      <td>S1</td>\n",
       "      <td>S5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>lgdp</td>\n",
       "      <td>data\\inputs\\upstream\\bokdpm_lgdp_2000_2035.csv</td>\n",
       "      <td>144</td>\n",
       "      <td>1</td>\n",
       "      <td>2000Q1</td>\n",
       "      <td>2035Q4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           자료                                              파일    행   열  \\\n",
       "0   levels_36              data\\inputs\\upstream\\levels_36.csv  184  37   \n",
       "1   levels_62              data\\inputs\\upstream\\levels_62.csv  104  63   \n",
       "2   levels_69              data\\inputs\\upstream\\levels_69.csv  104  70   \n",
       "3  levels_agg             data\\inputs\\upstream\\levels_agg.csv  184   2   \n",
       "4       io_36          data\\inputs\\upstream\\io_linkage_36.csv   36  36   \n",
       "5       io_62          data\\inputs\\upstream\\io_linkage_62.csv   62  62   \n",
       "6       io_69          data\\inputs\\upstream\\io_linkage_69.csv   69  69   \n",
       "7   exog_hist           data\\inputs\\upstream\\exog_hist_v2.csv  104   6   \n",
       "8   exog_scen           data\\inputs\\upstream\\exog_scen_v2.csv  200   7   \n",
       "9        lgdp  data\\inputs\\upstream\\bokdpm_lgdp_2000_2035.csv  144   1   \n",
       "\n",
       "      첫 행           끝 행  결측  \n",
       "0  1980Q1        2025Q4   0  \n",
       "1  2000Q1        2025Q4   0  \n",
       "2  2000Q1        2025Q4   0  \n",
       "3  1980Q1        2025Q4   0  \n",
       "4    농림어업       기타 서비스업   0  \n",
       "5    1.농업  62.수리ㆍ개인서비스업   0  \n",
       "6    1.농업          토목건설   0  \n",
       "7  2000Q1        2025Q4   0  \n",
       "8      S1            S5   0  \n",
       "9  2000Q1        2035Q4   0  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rows = []\n",
    "for k, p in C.UP.items():\n",
    "    df = pd.read_csv(p, index_col=0, encoding=\"utf-8-sig\")\n",
    "    rows.append({\"자료\": k, \"파일\": os.path.relpath(p, C.HERE), \"행\": df.shape[0], \"열\": df.shape[1],\n",
    "                 \"첫 행\": str(df.index[0]), \"끝 행\": str(df.index[-1]), \"결측\": int(df.isna().sum().sum())})\n",
    "up = pd.DataFrame(rows)\n",
    "up.to_csv(os.path.join(C.INTERIM, \"upstream_check.csv\"), index=False, encoding=\"utf-8-sig\")\n",
    "qs = [q for q in pd.read_csv(C.UP[\"levels_62\"], index_col=0).index if \"2000Q1\" <= q <= \"2025Q4\"]\n",
    "sums = pd.DataFrame({r: pd.read_csv(C.UP[f\"levels_{r}\"], index_col=0).reindex(qs).drop(columns=\"총량GDP\").sum(axis=1) for r in C.RES})\n",
    "gap = float((sums.max(axis=1) - sums.min(axis=1)).max())\n",
    "print(f\"분기 산업 합계의 분류 간 최대 차이: {gap:.1e}십억 원\")\n",
    "assert gap < 1e-6\n",
    "ex_s = pd.read_csv(C.UP[\"exog_scen\"], encoding=\"utf-8-sig\")\n",
    "assert sorted(ex_s[\"시나리오\"].unique()) == C.SCENARIOS and len(ex_s) == 200 and not ex_s.isna().any().any()\n",
    "lg = pd.read_csv(C.UP[\"lgdp\"], index_col=0, encoding=\"utf-8-sig\")[\"LGDP_kor\"]\n",
    "ga = R.bokdpm_annual_gdp(lg)\n",
    "print(f\"BOKDPM 실질GDP 연간 증가율(%): \" + \", \".join(f\"{y} {100 * (ga[y] / ga[y - 1] - 1):.2f}\" for y in [2025, 2026, 2028, 2030, 2035]))\n",
    "up"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f844203e",
   "metadata": {},
   "source": [
    "## 3. 기존 전망(2024–2034판)\n",
    "\n",
    "한국고용정보원에 전달된 기존 전망 엑셀(62분류 부가가치·총산출, 불변 백만 원, 2000–2050)의 VA 시트에서 2000–2035년 열을 추출한 것이다.\n",
    "2023년까지는 실적이고 2024년부터는 전망이다. 전산업 행은 62개 산업의 합이며, 정합화의 기존 전망 성장인자는 이 전산업 행에서 만든다.\n",
    "전달 템플릿(`template_62_VA_v1.xlsx`)은 같은 시트를 2034년까지 자른 것이므로 2000–2034년 값이 추출본과 같아야 한다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b96f5a25",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T07:24:14.954792Z",
     "iopub.status.busy": "2026-10-08T07:24:14.954291Z",
     "iopub.status.idle": "2026-10-08T07:24:14.980670Z",
     "shell.execute_reply": "2026-10-08T07:24:14.980670Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "산업 62개 · 2000–2035 · 전산업 행 − 산업 합 최대 상대차 3.9e-16\n",
      "전달 템플릿 2000–2034 대 기존 전망 추출본: 2205칸 대조, 최대 절대차 4.77e-07백만 원\n",
      "원본 엑셀 재추출 대조: VAF_SOURCE_DIR이 없어 건너뛴다(동결 CSV를 쓴다).\n",
      "기존 전망 전산업: 2024년 2,292.2조 → 2034년 2,694.5조, 연평균 1.63%\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>연도</th>\n",
       "      <th>2023</th>\n",
       "      <th>2024</th>\n",
       "      <th>2025</th>\n",
       "      <th>2026</th>\n",
       "      <th>2027</th>\n",
       "      <th>2028</th>\n",
       "      <th>2029</th>\n",
       "      <th>2030</th>\n",
       "      <th>2031</th>\n",
       "      <th>2032</th>\n",
       "      <th>2033</th>\n",
       "      <th>2034</th>\n",
       "      <th>2035</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>전산업_백만원</th>\n",
       "      <td>2,247,177,700.000</td>\n",
       "      <td>2,292,202,400.000</td>\n",
       "      <td>2,315,124,424.000</td>\n",
       "      <td>2,352,166,414.784</td>\n",
       "      <td>2,393,329,327.043</td>\n",
       "      <td>2,436,409,254.929</td>\n",
       "      <td>2,481,295,288.770</td>\n",
       "      <td>2,525,452,043.662</td>\n",
       "      <td>2,568,862,636.658</td>\n",
       "      <td>2,611,510,600.783</td>\n",
       "      <td>2,653,379,932.051</td>\n",
       "      <td>2,694,455,129.796</td>\n",
       "      <td>2,734,721,231.247</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>증가율_%</th>\n",
       "      <td>1.583</td>\n",
       "      <td>2.004</td>\n",
       "      <td>1.000</td>\n",
       "      <td>1.600</td>\n",
       "      <td>1.750</td>\n",
       "      <td>1.800</td>\n",
       "      <td>1.842</td>\n",
       "      <td>1.780</td>\n",
       "      <td>1.719</td>\n",
       "      <td>1.660</td>\n",
       "      <td>1.603</td>\n",
       "      <td>1.548</td>\n",
       "      <td>1.494</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "연도                   2023              2024              2025  \\\n",
       "전산업_백만원 2,247,177,700.000 2,292,202,400.000 2,315,124,424.000   \n",
       "증가율_%               1.583             2.004             1.000   \n",
       "\n",
       "연도                   2026              2027              2028  \\\n",
       "전산업_백만원 2,352,166,414.784 2,393,329,327.043 2,436,409,254.929   \n",
       "증가율_%               1.600             1.750             1.800   \n",
       "\n",
       "연도                   2029              2030              2031  \\\n",
       "전산업_백만원 2,481,295,288.770 2,525,452,043.662 2,568,862,636.658   \n",
       "증가율_%               1.842             1.780             1.719   \n",
       "\n",
       "연도                   2032              2033              2034  \\\n",
       "전산업_백만원 2,611,510,600.783 2,653,379,932.051 2,694,455,129.796   \n",
       "증가율_%               1.660             1.603             1.548   \n",
       "\n",
       "연도                   2035  \n",
       "전산업_백만원 2,734,721,231.247  \n",
       "증가율_%               1.494  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prev = pd.read_csv(C.PREV_KEIS, encoding=\"utf-8-sig\")\n",
    "ptot = prev[prev[\"번호\"] == 0].set_index(\"연도\")[\"VA_백만원\"]\n",
    "psum = prev[prev[\"번호\"] > 0].groupby(\"연도\")[\"VA_백만원\"].sum()\n",
    "print(f\"산업 {prev.loc[prev['번호'] > 0, '번호'].nunique()}개 · {prev['연도'].min()}–{prev['연도'].max()}\"\n",
    "      f\" · 전산업 행 − 산업 합 최대 상대차 {((ptot - psum).abs() / ptot).max():.1e}\")\n",
    "assert ((ptot - psum).abs() / ptot).max() < 1e-12\n",
    "\n",
    "tmpl = R.extract_va_sheet(C.TEMPLATE, \"62분류_불변VA\", 2000, 2034)\n",
    "m = tmpl.merge(prev, on=[\"번호\", \"연도\"], suffixes=(\"_템플릿\", \"_기존\"))\n",
    "d_tmpl = (m[\"VA_백만원_템플릿\"] - m[\"VA_백만원_기존\"]).abs().max()\n",
    "print(f\"전달 템플릿 2000–2034 대 기존 전망 추출본: {len(m)}칸 대조, 최대 절대차 {d_tmpl:.2e}백만 원\")\n",
    "assert len(m) == len(tmpl) and d_tmpl < 1e-6\n",
    "\n",
    "if C.SOURCE_DIR:                                   # 선택: 원본 엑셀에서 다시 추출해 동결 CSV와 대조\n",
    "    fn, sheet = C.SOURCE_XLSX[\"prev_keis_va_62.csv\"]\n",
    "    src = os.path.join(C.SOURCE_DIR, fn)\n",
    "    re_ex = R.extract_va_sheet(src, sheet, 2000, 2035)\n",
    "    dd = (re_ex[\"VA_백만원\"].values - prev[\"VA_백만원\"].values)\n",
    "    print(f\"원본 엑셀 재추출 대조: {len(re_ex)}칸, 최대 절대차 {np.abs(dd).max():.2e}백만 원 (원본 SHA-256 {R.sha256(src)[:16]}…)\")\n",
    "    assert len(re_ex) == len(prev) and np.abs(dd).max() < 1e-5\n",
    "else:\n",
    "    print(\"원본 엑셀 재추출 대조: VAF_SOURCE_DIR이 없어 건너뛴다(동결 CSV를 쓴다).\")\n",
    "\n",
    "pt = pd.DataFrame({\"전산업_백만원\": ptot, \"증가율_%\": ptot.pct_change() * 100})\n",
    "pt.to_csv(os.path.join(C.INTERIM, \"prev_total_keis.csv\"), encoding=\"utf-8-sig\")\n",
    "print(f\"기존 전망 전산업: 2024년 {ptot[2024]/1e6:,.1f}조 → 2034년 {ptot[2034]/1e6:,.1f}조, 연평균 {R.cagr(ptot[2024], ptot[2034], 10):.2f}%\")\n",
    "pt.loc[2023:2035].T"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d28da3bc",
   "metadata": {},
   "source": [
    "## 4. 이전 판 공표 산출물 — 비교 기준\n",
    "\n",
    "이전 판(2026-09-03 공표)의 바텀업·총량·정합화 전망을 요약한다. 정비판과의 비교(03 표 6)와 이전 판 전달본 재현 점검(03 검증)에 쓴다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "5cd33b36",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T07:24:14.981673Z",
     "iopub.status.busy": "2026-10-08T07:24:14.981673Z",
     "iopub.status.idle": "2026-10-08T07:24:15.202190Z",
     "shell.execute_reply": "2026-10-08T07:24:15.202190Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "</style>\n",
       "<table id=\"T_5f549\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"index_name level0\" >구분</th>\n",
       "      <th id=\"T_5f549_level0_col0\" class=\"col_heading level0 col0\" >바텀업 62</th>\n",
       "      <th id=\"T_5f549_level0_col1\" class=\"col_heading level0 col1\" >정합화 62</th>\n",
       "      <th id=\"T_5f549_level0_col2\" class=\"col_heading level0 col2\" >총량 VARX</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th class=\"index_name level0\" >시나리오</th>\n",
       "      <th class=\"blank col0\" >&nbsp;</th>\n",
       "      <th class=\"blank col1\" >&nbsp;</th>\n",
       "      <th class=\"blank col2\" >&nbsp;</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_5f549_level0_row0\" class=\"row_heading level0 row0\" >S1</th>\n",
       "      <td id=\"T_5f549_row0_col0\" class=\"data row0 col0\" >4.88</td>\n",
       "      <td id=\"T_5f549_row0_col1\" class=\"data row0 col1\" >2.13</td>\n",
       "      <td id=\"T_5f549_row0_col2\" class=\"data row0 col2\" >2.49</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5f549_level0_row1\" class=\"row_heading level0 row1\" >S2</th>\n",
       "      <td id=\"T_5f549_row1_col0\" class=\"data row1 col0\" >4.29</td>\n",
       "      <td id=\"T_5f549_row1_col1\" class=\"data row1 col1\" >1.98</td>\n",
       "      <td id=\"T_5f549_row1_col2\" class=\"data row1 col2\" >2.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5f549_level0_row2\" class=\"row_heading level0 row2\" >S3</th>\n",
       "      <td id=\"T_5f549_row2_col0\" class=\"data row2 col0\" >5.17</td>\n",
       "      <td id=\"T_5f549_row2_col1\" class=\"data row2 col1\" >2.20</td>\n",
       "      <td id=\"T_5f549_row2_col2\" class=\"data row2 col2\" >2.63</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5f549_level0_row3\" class=\"row_heading level0 row3\" >S4</th>\n",
       "      <td id=\"T_5f549_row3_col0\" class=\"data row3 col0\" >5.66</td>\n",
       "      <td id=\"T_5f549_row3_col1\" class=\"data row3 col1\" >2.32</td>\n",
       "      <td id=\"T_5f549_row3_col2\" class=\"data row3 col2\" >2.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5f549_level0_row4\" class=\"row_heading level0 row4\" >S5</th>\n",
       "      <td id=\"T_5f549_row4_col0\" class=\"data row4 col0\" >4.56</td>\n",
       "      <td id=\"T_5f549_row4_col1\" class=\"data row4 col1\" >2.03</td>\n",
       "      <td id=\"T_5f549_row4_col2\" class=\"data row4 col2\" >2.32</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x25cb1ac04a0>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rows = []\n",
    "for lab, f in [(\"바텀업 62\", \"bottomup_annual_62.csv\"), (\"총량 VARX\", \"topdown_annual_AGG.csv\"), (\"정합화 62\", \"forecast_annual_62.csv\")]:\n",
    "    t = R.totals(R.read_long(os.path.join(C.PREV_DIR, f)))\n",
    "    a = t.loc[C.BASE_YEAR, \"실적\"]\n",
    "    for s in C.SCENARIOS:\n",
    "        rows.append({\"구분\": lab, \"시나리오\": s, \"2025(조원)\": a / 1e3, \"2035(조원)\": t.loc[C.END_YEAR, s] / 1e3,\n",
    "                     \"연평균(%)\": R.cagr(a, t.loc[C.END_YEAR, s], 10)})\n",
    "pv = pd.DataFrame(rows)\n",
    "pv.to_csv(os.path.join(C.INTERIM, \"prev_version_totals.csv\"), index=False, encoding=\"utf-8-sig\")\n",
    "pv.pivot(index=\"시나리오\", columns=\"구분\", values=\"연평균(%)\").style.format(\"{:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c70ca358",
   "metadata": {},
   "source": [
    "## 5. 산출물\n",
    "\n",
    "다음 노트북(`02_분석.ipynb`)은 `data/inputs/`의 입력을 직접 읽는다. 아래 중간 산출물은 입수 단계의 점검 기록이다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "32017f14",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T07:24:15.203193Z",
     "iopub.status.busy": "2026-10-08T07:24:15.203193Z",
     "iopub.status.idle": "2026-10-08T07:24:15.206205Z",
     "shell.execute_reply": "2026-10-08T07:24:15.206205Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fill_check_prev.xlsx           42,463 bytes\n",
      "input_check.csv                 2,164 bytes\n",
      "prev_total_keis.csv             1,533 bytes\n",
      "prev_version_totals.csv           986 bytes\n",
      "upstream_check.csv                792 bytes\n"
     ]
    }
   ],
   "source": [
    "for f in sorted(os.listdir(C.INTERIM)):\n",
    "    p = os.path.join(C.INTERIM, f)\n",
    "    print(f\"{f:<28} {os.path.getsize(p):>8,d} bytes\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
