Python コード集

講義で使用するpythonのコードを以下に載せています.必要に応じてコピーして使用してください.プログラムの詳細は授業内で配布している資料を参照してください.

目次

クリックすることで該当のコードにジャンプします.戻る時はブラウザーの「戻る」を使用してください.

使い方

データの取得

app_idには各自が取得したapp idを入れてください.以下のコードで国内総生産のデータ系列が取得できます.


stats_data_id = '0004028585'
cat01_code = '17'  
df = get_estat_data_by_cat01(app_id, stats_data_id, cat01_code)
print(df.head())
    

データのプロット

データ系列のグラフを描くことができます.


plot_estat_series_autotime(df, title='国内総生産', ylabel='金額(10億円)')
    

以下のようなグラフが作成できます.

GDP

Python コード

ライブラリのインポート


import pandas as pd

import matplotlib.pyplot as plt
from matplotlib.ticker import StrMethodFormatter
plt.rcParams['font.family'] = 'Hiragino Sans'

import requests
import subprocess
import re
    

統計表IDの検索

e-Stat APIのgetStatsListを使って,指定したキーワードに一致する統計表IDとタイトルを取得する関数


def get_estat_stats_list(app_id, search_word, lang="J", limit=100):
    """
    e-Stat APIのgetStatsListを使って、指定したキーワードに一致する統計表IDと
    タイトルを取得する。

    Parameters:
        app_id (str): e-StatのアプリケーションID
        search_word (str): 検索キーワード(例:"国民経済計算")
        lang (str): 言語コード("J"=日本語、"E"=英語)。デフォルトは"J"
        limit (int): 最大取得件数(デフォルト100件)

    Returns:
        list of dict: 統計表のIDとタイトルのリスト(例:[{id: ..., title: ...}, ...])
    """
    url = "https://api.e-stat.go.jp/rest/3.0/app/json/getStatsList"
    params = {
        "appId": app_id,
        "searchWord": search_word,
        "lang": lang,
        "limit": limit
    }

    response = requests.get(url, params=params)
    response.encoding = 'utf-8'

    if response.status_code != 200:
        raise Exception(f"API呼び出し失敗(HTTP {response.status_code})")

    try:
        tables = response.json()["GET_STATS_LIST"]["DATALIST_INF"]["TABLE_INF"]
        results = [{"id": entry["@id"], 
            "title": entry["TITLE"]["$"]} for entry in tables]
        return results
    except KeyError:
        print("レスポンスの構造が想定外です。内容を確認してください:")
        print(response.json())
        return []

    

TABLE_INF のネスト構造の平坦化

e-Stat の TABLE_INF のネスト構造を平坦化して,1行のDataFrameに変換する関数


def flatten_table_info(table_info_dict):
    """
    e-Stat の TABLE_INF のネスト構造を平坦化して、1行のDataFrameに変換する。

    Parameters:
        table_info_dict (dict): TABLE_INF の辞書データ

    Returns:
        pd.DataFrame: 1行のDataFrame(各要素が列)
    """
    flat_data = {}

    for key, value in table_info_dict.items():
        if isinstance(value, dict):
            # ネストされた辞書
            #(例:'STAT_NAME': {'@code': '001', '$': '統計名'})
            for sub_key, sub_val in value.items():
                flat_key = f"{key}.{sub_key}"
                flat_data[flat_key] = sub_val
        else:
            # 単一の値
            flat_data[key] = value

    return pd.DataFrame([flat_data])
    

統計表の基本情報(TABLE_INF)とデータ系列(cat01分類)の一覧を取得

e-Stat APIから統計表の基本情報(TABLE_INF)とデータ系列(cat01分類)の一覧を取得する関数


def get_estat_metadata(app_id, stats_data_id):
    """
    e-Stat APIから統計表の基本情報(TABLE_INF)と
    データ系列(cat01分類)の一覧を取得する(データ本体は含まない)

    Parameters:
        app_id (str): e-StatのアプリケーションID
        stats_data_id (str): 統計表ID

    Returns:
        tuple:
            - dict: 統計表の基本情報(TABLE_INF)
            - pd.DataFrame: データ系列(cat01)の一覧(code, name)
    """
    url = 'https://api.e-stat.go.jp/rest/3.0/app/json/getStatsData'

    # e-Stat API パラメータ設定
    params = {
        'appId': app_id,  
        # e-Stat アプリケーションID(APIキーをここに指定)
        'lang': 'J',  # 言語設定: 'J' = 日本語, 'E' = 英語
        'statsDataId': stats_data_id,  
        # 統計表ID(e-Stat の個別統計に対応するID)
        'metaGetFlg': 'Y',  
        # 分類メタ情報(cat01, area など)を取得するか
        # ('Y' = 取得, 'N' = 省略)
        'cntGetFlg': 'N',  
        # データ件数のみ取得するか ('Y' = 件数だけ, 'N' = データ本体を取得)
        'explanationGetFlg': 'Y',  
        # 統計表の説明文を取得するか ('Y' = 取得, 'N' = 省略)
        'annotationGetFlg': 'Y',  
        # 注記・脚注の情報を取得するか ('Y' = 取得, 'N' = 省略)
        'sectionHeaderFlg': '1',  
        # 表章項目(ヘッダー情報)を取得するか ('1' = 含める, '0' = 含めない)
        'replaceSpChars': '0'  
        # 特殊文字をHTMLエンティティなどに置換するか
        # ('0' = そのまま, '1' = エスケープ)
    }

    response = requests.get(url, params=params)
    data = response.json()

    if data['GET_STATS_DATA']['RESULT']['STATUS'] != 0:
        raise Exception(f"e-Stat APIエラー: {data['GET_STATS_DATA']
            ['RESULT']['ERROR_MSG']}")

    stat_data = data['GET_STATS_DATA']['STATISTICAL_DATA']

    table_info_raw = stat_data['TABLE_INF']
    df_table_info = flatten_table_info(table_info_raw)

    # 統計表の基本情報
    table_info = stat_data['TABLE_INF']

    # データ系列(cat01)一覧の抽出
    class_objs = stat_data['CLASS_INF']['CLASS_OBJ']
    cat01_list = []
    for obj in class_objs:
        if obj['@id'] == 'cat01':
            for item in obj['CLASS']:
                cat01_list.append({
                    'cat01': item['@code'],
                    'name': item['@name']
                })
    df_cat01 = pd.DataFrame(cat01_list)

    return df_table_info, df_cat01
    

統計表IDとcat01コードに対応するデータを取得

指定した統計表IDとcat01コードに対応するデータをe-Stat APIから取得する関数


def get_estat_data_by_cat01(app_id, stats_data_id, cat01_code):
    """
    指定した統計表IDとcat01コードに対応するデータをe-Stat APIから取得。

    Parameters:
        app_id (str): e-StatのアプリケーションID
        stats_data_id (str): 統計表ID(statsDataId)
        cat01_code (str): 取得対象のデータ系列コード(例:'0001')

    Returns:
        pd.DataFrame: 該当cat01のデータ(time, area, cat01, value)
    """
    url = 'https://api.e-stat.go.jp/rest/3.0/app/json/getStatsData'

    params = {
        'appId': app_id,
        'lang': 'J',
        'statsDataId': stats_data_id,
        'cdCat01': cat01_code,       # ← ここでcat01をフィルタ
        'metaGetFlg': 'N',
        'cntGetFlg': 'N',
        'explanationGetFlg': 'N',
        'annotationGetFlg': 'N',
        'sectionHeaderFlg': '1',
        'replaceSpChars': '0'
    }

    response = requests.get(url, params=params)
    data = response.json()

    if data['GET_STATS_DATA']['RESULT']['STATUS'] != 0:
        raise Exception(f"e-Stat APIエラー: {data['GET_STATS_DATA']['RESULT']
            ['ERROR_MSG']}")

    records = data['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE']

    df = pd.DataFrame([{
        'time': rec.get('@time'),
        'area': rec.get('@area'),
        'cat01': rec.get('@cat01'),
        'value': rec.get('$')
    } for rec in records])

    return df
    

e-Stat の time コードから表示用ラベル(年・月・四半期)を生成

e-Stat の time コードから表示用ラベル(年・月・四半期)を生成する関数


def parse_time_label(time_code):
    """
    e-Stat の time コードから表示用ラベル(年・月・四半期)を生成

    例:
        2020010000 → 2020-01
        2020040101 → 2020Q1
        1980000000 → 1980
    """
    time_code = str(time_code)

    if re.match(r'^¥d{4}000000$', time_code):
        # 年次
        return time_code[:4]
    elif re.match(r'^¥d{6}0000$', time_code):
        # 月次(例:2023010000)
        year = time_code[:4]
        month = time_code[4:6]
        return f"{year}-{month}"
    elif re.match(r'^¥d{6}010[1-4]$', time_code):
        # 四半期(例:2020010101 → Q1)
        year = time_code[:4]
        q_map = {'01': 'Q1', '02': 'Q2', '03': 'Q3', '04': 'Q4'}
        q = q_map.get(time_code[-2:], '')
        return f"{year}{q}"
    else:
        return time_code  # 変換できない場合はそのまま返す
    

e-Stat の time コードを自動整形し、折れ線グラフとしてプロット

e-Stat の time コードを自動整形し、折れ線グラフとしてプロットする関数


def plot_estat_series_autotime(df, title='e-Stat 時系列グラフ', 
        ylabel='値', xlabel='時点',
        figsize=(10, 5), savefile=None, dpi=300):
    """
    e-Stat の time コードを自動整形し、折れ線グラフとしてプロット。
    Y軸は3桁ごとにカンマ区切り。

    Parameters:
        df (pd.DataFrame): 'time' と 'value' を含む DataFrame
    """
    df = df.copy()
    df['label'] = df['time'].apply(parse_time_label)
    df['value'] = pd.to_numeric(df['value'], errors='coerce')

    df_sorted = df.sort_values('label')

    plt.figure(figsize=figsize)
    plt.plot(df_sorted['label'], df_sorted['value'], marker='o', linestyle='-')

    plt.title(title)
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    plt.xticks(rotation=45, ha='right')

    # ✅ 3桁ごとにカンマを追加
    ax = plt.gca()
    ax.yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))  # 小数なし

    plt.grid(True)
    plt.tight_layout()

    # ✅ 保存処理(指定された場合)
    if savefile:
        plt.savefig(folder_path+savefile, dpi=dpi)
        print(f'グラフを保存しました: {savefile}')
    
    plt.show()
    

コードのタイトル

コードの説明e-Stat


ここにコードを書く
    

コードのタイトル

コードの説明e-Stat


ここにコードを書く
    

コードのタイトル

コードの説明e-Stat


ここにコードを書く
    

コードのタイトル

コードの説明e-Stat


ここにコードを書く