├── .gitignore ├── LICENSE.txt ├── Pipfile ├── README.md ├── boundary.sh ├── e_stat ├── .gitignore ├── __init__.py ├── __main__.py ├── assets │ ├── default_stats_table_ids.csv │ ├── government_statistics_codes.tsv │ ├── pref_code.json │ └── standard_area_codes.csv ├── env_settings.py ├── lib │ ├── __init__.py │ ├── area_code.py │ ├── gdf_dissolve.py │ ├── merge_boundary_stats.py │ ├── pref_code.py │ ├── shp_to_geopandas.py │ ├── stats_data.py │ ├── stats_ids.py │ └── stats_meta_data.py └── utils │ ├── __init__.py │ ├── df_utils.py │ ├── e_stat_utils.py │ └── gdf_geojson.py ├── ids.sh ├── main_script_run.sh ├── merge_boundary.sh ├── meta_data.sh └── stats_data.sh /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /api_requests/ 3 | /download_file/ 4 | /extract_zip/ 5 | /test/ 6 | /created/ 7 | .prettierrc 8 | .node-version 9 | package-lock.json 10 | Pipfile.lock 11 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 MIERUNE 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | name = "pypi" 3 | url = "https://pypi.org/simple" 4 | verify_ssl = true 5 | 6 | [dev-packages] 7 | 8 | [packages] 9 | requests = "==2.25.0" 10 | geopandas = "==0.8.1" 11 | pandas = "==1.1.5" 12 | tqdm = "==4.54.1" 13 | click = "==7.1.2" 14 | python-dotenv = "==0.15.0" 15 | geojson = "==2.5.0" 16 | 17 | [requires] 18 | python_version = "3.9" 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # e_stat_api_sample 2 | 3 | e-statのAPIを簡単に利用するためのCLIツール 4 | (パッケージとしても利用可能) 5 | 6 | ## usage 7 | 8 | ### install library 9 | 10 | ```shell script 11 | % pwd 12 | .../e_stat_api_sample 13 | % pipenv install 14 | ``` 15 | 16 | ### setup .env 17 | 18 | ``` 19 | touch /e_stat_api_sample/e_stat/.env 20 | echo "app_id=" >> /e_stat_api_sample/e_stat/.env 21 | ``` 22 | 23 | #### what's app_id 24 | 25 | [https://www.e-stat.go.jp/api/api-dev/how_to_use](https://www.e-stat.go.jp/api/api-dev/how_to_use) 26 | 27 | ### commands 28 | 29 | #### e_stat 30 | 31 | ``` 32 | % pipenv run python -m e_stat --help 33 | Usage: __main__.py [OPTIONS] COMMAND [ARGS]... 34 | 35 | e-statのAPIを簡単に利用するためのCLIツール 36 | 37 | Options: 38 | --help Show this message and exit. 39 | 40 | Commands: 41 | boundary 境界データを取得 42 | ids 統計表ID一覧を取得 43 | merge-boundary 統計データと境界データを取得してマージする 44 | meta 統計表メタデータを取得 45 | stats 統計データを取得 46 | ``` 47 | 48 | #### boundary 49 | 50 | ``` 51 | % pipenv run python -m e_stat boundary --help 52 | Usage: __main__.py boundary [OPTIONS] 53 | 54 | 境界データを取得 55 | 56 | Options: 57 | -p, --pref_name TEXT 取得するshpファイルの都道府県コードを入力 [required] 58 | -o, --output_dir TEXT ダウンロードファイルを格納するディレクトリのパス文字列を入力 [required] 59 | --help Show this message and exit. 60 | ``` 61 | 62 | #### ids 63 | 64 | ``` 65 | % pipenv run python -m e_stat ids --help 66 | Usage: __main__.py ids [OPTIONS] 67 | 68 | 統計表ID一覧を取得 69 | 70 | Options: 71 | -g, --gov_stats_code TEXT 取得したい統計表ID一覧の政府統計コードを入力 [required] 72 | -o, --output_dir TEXT ダウンロードしたcsvを格納するディレクトリのパス文字列を入力 [required] 73 | --help Show this message and exit. 74 | ``` 75 | 76 | #### meta 77 | 78 | ``` 79 | % pipenv run python -m e_stat meta --help 80 | Usage: __main__.py meta [OPTIONS] 81 | 82 | 統計表メタデータを取得 83 | 84 | Options: 85 | -st, --stats_table_id TEXT 取得したい統計表メタデータの統計表IDを入力 [required] 86 | -o, --output_dir TEXT ダウンロードしたcsvを格納するディレクトリのパス文字列を入力 [required] 87 | --help Show this message and exit. 88 | ``` 89 | 90 | #### stats 91 | 92 | ``` 93 | % pipenv run python -m e_stat stats --help 94 | Usage: __main__.py stats [OPTIONS] 95 | 96 | 統計データを取得 97 | 98 | Options: 99 | -a, --areas TEXT 取得する統計データの標準地域コードをカンマ区切り文字列で入力(例:01101,01103,01105) [required] 100 | 101 | -c, --class_codes TEXT 取得する統計データの項目をカンマ区切り文字列で入力(例:A1101,A110101,A110101) [required] 102 | 103 | -y, --years TEXT 取得する統計データの年度をカンマ区切り文字列で入力(例:2000,2005,2010) [required] 104 | 105 | -st, --stats_table_id TEXT 取得したい統計データの統計表IDを入力 [required] 106 | -o, --output_dir TEXT ダウンロードしたcsvを格納するディレクトリのパス文字列を入力 [required] 107 | --help Show this message and exit. 108 | ``` 109 | 110 | #### merge-boundary 111 | 112 | ``` 113 | % pipenv run python -m e_stat merge-boundary --help 114 | Usage: __main__.py merge-boundary [OPTIONS] 115 | 116 | 統計データと境界データを取得してマージする 117 | 118 | Options: 119 | -p, --pref_name TEXT 取得するshpファイルの都道府県名を入力 [required] 120 | -d, --download_dir TEXT ダウンロードするshpファイルを格納するディレクトリのパス文字列を入力 [required] 121 | -a, --area TEXT 取得する統計データの標準地域コードを入力 [required] 122 | -c, --class_code TEXT 取得する統計データの項目を入力 [required] 123 | -y, --year TEXT 取得する統計データの年度を入力 [required] 124 | -st, --stats_table_id TEXT 取得したい統計データの統計表IDを入力 [required] 125 | -o, --output_dir TEXT ダウンロードしたcsvを格納するディレクトリのパス文字列を入力 [required] 126 | --help Show this message and exit. 127 | ``` 128 | 129 | ### example 130 | 131 | - 各種コマンドはサンプルとしてshell scriptを用意しているので、そちらも参照 132 | 133 | ```shell script 134 | % pipenv run python -m e_stat merge-boundary \ 135 | -p 北海道 \ 136 | -d ./download_file \ 137 | -a 01101 \ 138 | -c A1101 \ 139 | -y 2000 \ 140 | -st 0000020101 \ 141 | -o ./created 142 | ``` 143 | 144 | or 145 | 146 | ```shell script 147 | % bash merge_boundary.sh 148 | ``` 149 | 150 | ### work flow 151 | 152 | #### get boundary data 153 | 154 | - 取得したい境界データの都道府県とダウンロード先のディレクトリを指定しshpが格納されたzipファイルをダウンロードします。 155 | - 都道府県は`/e_stat_api_tools/e_stat/assets/pref_code.json`に記載されています。 156 | 157 | ``` 158 | % pipenv run python -m e_stat boundary \ 159 | -p 北海道 \ 160 | -d ./download_file 161 | ``` 162 | 163 | #### get raw data of stats 164 | 165 | - `e_stat/assets/government_statistics_codes.tsv`または以下の公式ページから取得したい政府統計名の政府統計コードを確認します。 166 | - [政府統計コード一覧](https://www.e-stat.go.jp/help/stat-search-3-5) 167 | - [政府統計一覧](https://www.e-stat.go.jp/stat-search/database?page=1) 168 | - 取得したい統計表ID一覧の政府統計コードとcsv書き出し先のディレクトリを指定して、`ids`コマンドを実行します。 169 | 170 | ``` 171 | % pipenv run python -m e_stat ids \ 172 | -g 00200502 \ 173 | -o ./created 174 | ``` 175 | 176 | - 書き出された`stats_ids.csv`から取得したい統計表のメタデータ(詳細項目)を確認して`meta`コマンドに統計表ID(`TABLE_INF`カラム)を指定して実行します。 177 | 178 | ``` 179 | % pipenv run python -m e_stat meta \ 180 | -st 0000010101 \ 181 | -o ./created 182 | ``` 183 | 184 | - 取得したい統計表の「標準地域コード、詳細項目、年度」をカンマ区切り文字列で指定、さらに統計表IDと書き出し先ディレクトリを指定し`stats`コマンドを実行します。 185 | - 標準地域コード:`/e_stat/assets/standard_area_codes.csv`または[市区町村を探す](https://www.e-stat.go.jp/municipalities/cities/areacode) から探せます。 186 | - 詳細項目:`meta`コマンドで取得した`meta_data.csv`に記載の`CLASS_CODE`カラムのデータです。 187 | - 年度:データによって異なりますが、多くは1975年頃からデータが存在します。 188 | 189 | ``` 190 | % pipenv run python -m e_stat stats \ 191 | -a 01101,01105,01107,01203 \ 192 | -c A1101,A110101,A110102,A1102,A110201,A110202 \ 193 | -y 2000,2010 \ 194 | -st 0000020101 \ 195 | -o ./created 196 | ``` 197 | 198 | - 目的の`stats.csv`が書き出されます 199 | 200 | #### create merged data from boundary and stats data 201 | 202 | - 以下の項目を指定して`merge-boundary`コマンドを実行します。 203 | - 境界データの都道府県名を指定 204 | - shpが格納されたzipファイルのダウンロード先ディレクトリを指定 205 | - 取得したい統計データを指定 206 | - 標準地域コード 207 | - 統計表詳細項目 208 | - 取得年度 209 | - 統計表ID 210 | - ファイル書き出し先ディレクトリ 211 | - 以下の点に注意してください。 212 | - APIの仕様上、統計データのレスポンスが10万件を超えるとデータが取得できないため、取得したい地域や項目は絞った方が良い。 213 | - 取得する境界データと、統計データの地域が異なる(北海道を指定したのに、標準地域コードは青森県の地域を指定した、等)場合はデータが生成されない。 214 | - 取得する境界データに市区町村よりも細かい境界(町丁目など)はdissolveされます。 215 | 216 | ``` 217 | % pipenv run python -m e_stat merge-boundary \ 218 | -p 北海道 \ 219 | -d ./download_file \ 220 | -a 01101 \ 221 | -c A1101 \ 222 | -y 2000 \ 223 | -st 0000020101 \ 224 | -o ./created 225 | ``` 226 | 227 | - `-d`オプションで指定したディレクトリにzipファイルが格納されます。 228 | - `-o`オプションで指定したディレクトリには以下のファイルが格納されます。 229 | - 境界データをそのまま変換したファイル 230 | - `boundary.geojson` 231 | - `boundary.csv` 232 | - 境界データと統計データを結合したファイル 233 | - `merge_boundary.geojson` 234 | - `merge_boundary.csv` 235 | 236 | ※ このサービスは、政府統計総合窓口(e-Stat)のAPI機能を使用していますが、サービスの内容は国によって保証されたものではありません。 -------------------------------------------------------------------------------- /boundary.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | pipenv run python -m e_stat boundary \ 4 | -p 北海道 \ 5 | -d ./download_file -------------------------------------------------------------------------------- /e_stat/.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | 政府統計コード一覧.xlsx 3 | 標準地域コード(平成31年3月25日更新).csv -------------------------------------------------------------------------------- /e_stat/__init__.py: -------------------------------------------------------------------------------- 1 | from .lib import * 2 | from .utils import * -------------------------------------------------------------------------------- /e_stat/__main__.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | import click 4 | 5 | from .env_settings import app_id 6 | from .lib import AreaCode, GdfDissolve, MergeBoundaryStats, PrefCode, ShapeToGeoPandas, StatsData, StatsIds, \ 7 | StatsMetaData 8 | from .utils import df_to_geojson, geojson_str_to_obj, output_csv_from_df, write_geojson 9 | 10 | 11 | @click.group() 12 | def main(): 13 | """e-statのAPIを簡単に利用するためのCLIツール""" 14 | 15 | 16 | def _download_shp_file(pref_name, download_dir): 17 | """都道府県名とダウンロードするディレクトリを指定してe-statの境界shpを取得する 18 | 19 | Args: 20 | pref_name (str): 取得するshpファイルの都道府県コード 21 | download_dir (str): ダウンロードするshpファイルを格納するディレクトリのパス文字列 22 | 23 | Returns: 24 | Path: ダウンロードしたファイルのパスオブジェクト 25 | 26 | """ 27 | pref = PrefCode() 28 | pref_code = str(pref.name_to_code(pref_name)).zfill(2) 29 | 30 | area_code = AreaCode() 31 | output_dir = Path(download_dir).resolve() 32 | area_code.download_polygon_of_shp(pref_code, str(output_dir), False) 33 | download_path = area_code.download_file_path 34 | return download_path 35 | 36 | 37 | def _shp_to_boundary_gdf(shp_file_path): 38 | """.shpかshpが格納された.zipを指定してgdfを作成する 39 | 40 | Args: 41 | shp_file_path (Path): 変換対象のshpファイルを格納するディレクトリのパス文字列 42 | 43 | Returns: 44 | gpd.GeoDataFrame: shpを変換したGeoDataFrame 45 | 46 | """ 47 | s2g = ShapeToGeoPandas(str(shp_file_path.resolve())) 48 | gdf = s2g.gdf 49 | 50 | necessary_columns = [ 51 | "KEY_CODE", 52 | "PREF", 53 | "CITY", 54 | "PREF_NAME", 55 | "CITY_NAME", 56 | "geometry"] 57 | geo_d = GdfDissolve(gdf, necessary_columns) 58 | geo_d.join_columns("AREA_CODE", "PREF", "CITY") 59 | geo_d.dissolve_poly("AREA_CODE") 60 | boundary_gdf = geo_d.new_gdf 61 | 62 | geojson_obj = geojson_str_to_obj(df_to_geojson(boundary_gdf)) 63 | write_geojson(geojson_obj, "./created/", "boundary.geojson") 64 | 65 | output_csv_from_df(boundary_gdf, "./created/", "boundary.csv") 66 | return boundary_gdf 67 | 68 | 69 | @main.command() 70 | @click.option('-p', '--pref_name', required=True, 71 | type=str, help="取得するshpファイルの都道府県コードを入力") 72 | @click.option('-d', '--download_dir', required=True, 73 | type=str, help="ダウンロードするshpファイルを格納するディレクトリのパス文字列を入力") 74 | def boundary(pref_name, download_dir): 75 | """境界データを取得""" 76 | download_path = _download_shp_file(pref_name, download_dir) 77 | boundary_gdf = _shp_to_boundary_gdf(download_path) 78 | return boundary_gdf 79 | 80 | 81 | @main.command() 82 | @click.option("-g", "--gov_stats_code", required=True, 83 | type=str, help="取得したい統計表ID一覧の政府統計コードを入力") 84 | @click.option('-o', '--output_dir', required=True, 85 | type=str, help="ダウンロードしたcsvを格納するディレクトリのパス文字列を入力") 86 | def ids(gov_stats_code, output_dir): 87 | """統計表ID一覧を取得""" 88 | si = StatsIds(app_id, gov_stats_code) 89 | si_df = si.stats_table_ids_df 90 | si.stats_table_ids_to_csv(output_dir, "stats_ids.csv") 91 | return si_df 92 | 93 | 94 | @main.command() 95 | @click.option("-st", "--stats_table_id", required=True, 96 | type=str, help="取得したい統計表メタデータの統計表IDを入力") 97 | @click.option('-o', '--output_dir', required=True, 98 | type=str, help="ダウンロードしたcsvを格納するディレクトリのパス文字列を入力") 99 | def meta(stats_table_id, output_dir): 100 | """統計表メタデータを取得""" 101 | smt = StatsMetaData(app_id, stats_table_id) 102 | smt_df = smt.stats_meta_data_df 103 | smt.to_csv(output_dir, "meta_data.csv") 104 | return smt_df 105 | 106 | 107 | @main.command() 108 | @click.option('-a', '--areas', required=True, type=str, 109 | help="取得する統計データの標準地域コードをカンマ区切り文字列で入力(例:01101,01103,01105)") 110 | @click.option('-c', '--class_codes', required=True, type=str, 111 | help="取得する統計データの項目をカンマ区切り文字列で入力(例:A1101,A110101,A110101)") 112 | @click.option('-y', '--years', required=True, 113 | type=str, help="取得する統計データの年度をカンマ区切り文字列で入力(例:2000,2005,2010)") 114 | @click.option("-st", "--stats_table_id", required=True, 115 | type=str, help="取得したい統計データの統計表IDを入力") 116 | @click.option('-o', '--output_dir', required=True, 117 | type=str, help="ダウンロードしたcsvを格納するディレクトリのパス文字列を入力") 118 | def stats(areas, class_codes, years, stats_table_id, output_dir): 119 | """統計データを取得""" 120 | sd = StatsData( 121 | app_id, 122 | stats_table_id, 123 | output_dir, 124 | areas.split(","), 125 | class_codes.split(","), 126 | years.split(",")) 127 | stats_df = sd.stats_df 128 | sd.to_csv(output_dir, "stats.csv") 129 | return stats_df 130 | 131 | 132 | @main.command() 133 | @click.option('-p', '--pref_name', required=True, 134 | type=str, help="取得するshpファイルの都道府県名を入力") 135 | @click.option('-d', '--download_dir', required=True, 136 | type=str, help="ダウンロードするshpファイルを格納するディレクトリのパス文字列を入力") 137 | @click.option('-a', '--area', required=True, type=str, 138 | help="取得する統計データの標準地域コードを入力") 139 | @click.option('-c', '--class_code', required=True, type=str, 140 | help="取得する統計データの項目を入力") 141 | @click.option('-y', '--year', required=True, 142 | type=str, help="取得する統計データの年度を入力") 143 | @click.option("-st", "--stats_table_id", required=True, 144 | type=str, help="取得したい統計データの統計表IDを入力") 145 | @click.option('-o', '--output_dir', required=True, 146 | type=str, help="ダウンロードしたcsvを格納するディレクトリのパス文字列を入力") 147 | def merge_boundary( 148 | pref_name, 149 | download_dir, 150 | area, 151 | class_code, 152 | year, 153 | stats_table_id, 154 | output_dir): 155 | """統計データと境界データを取得してマージする""" 156 | download_path = _download_shp_file(pref_name, download_dir) 157 | 158 | boundary_gdf = _shp_to_boundary_gdf(download_path) 159 | 160 | mbs = MergeBoundaryStats(app_id, 161 | stats_table_id, 162 | boundary_gdf, 163 | area, 164 | class_code, 165 | year) 166 | merge_boundary_df = mbs.merged_df 167 | 168 | geojson_obj = geojson_str_to_obj(df_to_geojson(merge_boundary_df)) 169 | write_geojson(geojson_obj, "./created/", "merge_boundary.geojson") 170 | 171 | output_csv_from_df(merge_boundary_df, output_dir, "merge_boundary.csv") 172 | 173 | 174 | if __name__ == '__main__': 175 | main() 176 | -------------------------------------------------------------------------------- /e_stat/assets/default_stats_table_ids.csv: -------------------------------------------------------------------------------- 1 | TABLE_INF,STAT_CODE,STAT_NAME,GOV_ORG_CODE,GOV_ORG_NAME,TABULATION_CATEGORY,TABULATION_SUB_CATEGORY1,TABULATION_SUB_CATEGORY2,TABULATION_SUB_CATEGORY3,TABULATION_SUB_CATEGORY4,TABULATION_SUB_CATEGORY5,NO,TITLE,TABLE_CATEGORY,TABLE_SUB_CATEGORY1,TABLE_SUB_CATEGORY2,TABLE_SUB_CATEGORY3,CYCLE,SURVEY_DATE,OPEN_DATE,SMALL_AREA,COLLECT_AREA,OVERALL_TOTAL_NUMBER,UPDATED_DATE,MAIN_CATEGORY_CODE,MAIN_CATEGORY,SUB_CATEGORY_CODE,SUB_CATEGORY 2 | 0000010101,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010101,A 人口・世帯,,,,,年度次,0,2020-03-06,0,全国,486096,2020-03-06,99,その他,99,その他 3 | 0000010101,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010101,A 人口・世帯,,,,,年度次,0,2020-03-06,0,都道府県,486096,2020-03-06,99,その他,99,その他 4 | 0000010102,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010102,B 自然環境,,,,,年度次,0,2020-03-06,0,全国,61440,2020-03-06,99,その他,99,その他 5 | 0000010102,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010102,B 自然環境,,,,,年度次,0,2020-03-06,0,都道府県,61440,2020-03-06,99,その他,99,その他 6 | 0000010103,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010103,C 経済基盤,,,,,年度次,0,2020-03-06,0,全国,299952,2020-03-06,99,その他,99,その他 7 | 0000010103,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010103,C 経済基盤,,,,,年度次,0,2020-03-06,0,都道府県,299952,2020-03-06,99,その他,99,その他 8 | 0000010104,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010104,D 行政基盤,,,,,年度次,0,2020-03-06,0,全国,310128,2020-03-06,99,その他,99,その他 9 | 0000010104,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010104,D 行政基盤,,,,,年度次,0,2020-03-06,0,都道府県,310128,2020-03-06,99,その他,99,その他 10 | 0000010105,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010105,E 教育,,,,,年度次,0,2020-03-06,0,都道府県,521328,2020-03-06,99,その他,99,その他 11 | 0000010105,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010105,E 教育,,,,,年度次,0,2020-03-06,0,全国,521328,2020-03-06,99,その他,99,その他 12 | 0000010106,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010106,F 労働,,,,,年度次,0,2020-03-06,0,全国,245952,2020-03-06,99,その他,99,その他 13 | 0000010106,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010106,F 労働,,,,,年度次,0,2020-03-06,0,都道府県,245952,2020-03-06,99,その他,99,その他 14 | 0000010107,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010107,G 文化・スポーツ,,,,,年度次,0,2020-03-06,0,全国,88896,2020-04-03,99,その他,99,その他 15 | 0000010107,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010107,G 文化・スポーツ,,,,,年度次,0,2020-03-06,0,都道府県,88896,2020-04-03,99,その他,99,その他 16 | 0000010108,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010108,H 居住,,,,,年度次,0,2020-03-06,0,都道府県,261504,2020-04-03,99,その他,99,その他 17 | 0000010108,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010108,H 居住,,,,,年度次,0,2020-03-06,0,全国,261504,2020-04-03,99,その他,99,その他 18 | 0000010109,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010109,I 健康・医療,,,,,年度次,0,2020-03-06,0,都道府県,376224,2020-04-03,99,その他,99,その他 19 | 0000010109,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010109,I 健康・医療,,,,,年度次,0,2020-03-06,0,全国,376224,2020-04-03,99,その他,99,その他 20 | 0000010110,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010110,J 福祉・社会保障,,,,,年度次,0,2020-03-06,0,全国,401184,2020-03-06,99,その他,99,その他 21 | 0000010110,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010110,J 福祉・社会保障,,,,,年度次,0,2020-03-06,0,都道府県,401184,2020-03-06,99,その他,99,その他 22 | 0000010111,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010111,K 安全,,,,,年度次,0,2020-05-13,0,全国,232752,2020-05-13,99,その他,99,その他 23 | 0000010111,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010111,K 安全,,,,,年度次,0,2020-05-13,0,都道府県,232752,2020-05-13,99,その他,99,その他 24 | 0000010112,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010112,L 家計,,,,,年度次,0,2020-03-06,0,都道府県,148656,2020-03-06,99,その他,99,その他 25 | 0000010112,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010112,L 家計,,,,,年度次,0,2020-03-06,0,全国,148656,2020-03-06,99,その他,99,その他 26 | 0000010113,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010113,M 生活時間,,,,,年度次,0,2020-03-06,0,都道府県,70560,2020-04-03,99,その他,99,その他 27 | 0000010113,00200502,社会・人口統計体系,00200,総務省,都道府県データ,基礎データ,,,,,0000010113,M 生活時間,,,,,年度次,0,2020-03-06,0,全国,70560,2020-04-03,99,その他,99,その他 28 | 0000020101,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020101,A 人口・世帯,,,,,年度次,0,2020-06-22,0,市区町村,2009212,2020-09-03,99,その他,99,その他 29 | 0000020102,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020102,B 自然環境,,,,,年度次,0,2020-06-22,0,市区町村,475372,2020-09-03,99,その他,99,その他 30 | 0000020103,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020103,C 経済基盤,,,,,年度次,0,2020-06-22,0,市区町村,2017146,2020-09-03,99,その他,99,その他 31 | 0000020104,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020104,D 行政基盤,,,,,年度次,0,2020-06-22,0,市区町村,3599264,2020-09-03,99,その他,99,その他 32 | 0000020105,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020105,E 教育,,,,,年度次,0,2020-06-22,0,市区町村,1148398,2020-09-03,99,その他,99,その他 33 | 0000020106,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020106,F 労働,,,,,年度次,0,2020-06-22,0,市区町村,802221,2020-09-03,99,その他,99,その他 34 | 0000020107,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020107,G 文化・スポーツ,,,,,年度次,0,2020-06-22,0,市区町村,50180,2020-09-03,99,その他,99,その他 35 | 0000020108,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020108,H 居住,,,,,年度次,0,2020-06-22,0,市区町村,3074086,2020-09-03,99,その他,99,その他 36 | 0000020109,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020109,I 健康・医療,,,,,年度次,0,2020-06-22,0,市区町村,874147,2020-09-03,99,その他,99,その他 37 | 0000020110,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020110,J 福祉・社会保障,,,,,年度次,0,2020-06-22,0,市区町村,1726948,2020-09-03,99,その他,99,その他 38 | 0000020111,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(オリジナル),,,,,0000020111,K 安全,,,,,年度次,0,2020-06-22,0,市区町村,187005,2020-09-03,99,その他,99,その他 39 | 0000010201,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010201,A 人口・世帯,,,,,年度次,0,2020-03-06,0,全国,75648,2020-03-06,99,その他,99,その他 40 | 0000010201,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010201,A 人口・世帯,,,,,年度次,0,2020-03-06,0,都道府県,75648,2020-03-06,99,その他,99,その他 41 | 0000010202,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010202,B 自然環境,,,,,年度次,0,2020-03-06,0,都道府県,36000,2020-03-06,99,その他,99,その他 42 | 0000010202,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010202,B 自然環境,,,,,年度次,0,2020-03-06,0,全国,36000,2020-03-06,99,その他,99,その他 43 | 0000010203,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010203,C 経済基盤,,,,,年度次,0,2020-03-06,0,都道府県,27264,2020-03-06,99,その他,99,その他 44 | 0000010203,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010203,C 経済基盤,,,,,年度次,0,2020-03-06,0,全国,27264,2020-03-06,99,その他,99,その他 45 | 0000010204,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010204,D 行政基盤,,,,,年度次,0,2020-03-06,0,都道府県,94320,2020-03-06,99,その他,99,その他 46 | 0000010204,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010204,D 行政基盤,,,,,年度次,0,2020-03-06,0,全国,94320,2020-03-06,99,その他,99,その他 47 | 0000010205,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010205,E 教育,,,,,年度次,0,2020-03-06,0,都道府県,95088,2020-07-21,99,その他,99,その他 48 | 0000010205,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010205,E 教育,,,,,年度次,0,2020-03-06,0,全国,95088,2020-07-21,99,その他,99,その他 49 | 0000010206,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010206,F 労働,,,,,年度次,0,2020-03-06,0,都道府県,77568,2020-03-06,99,その他,99,その他 50 | 0000010206,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010206,F 労働,,,,,年度次,0,2020-03-06,0,全国,77568,2020-03-06,99,その他,99,その他 51 | 0000010207,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010207,G 文化・スポーツ,,,,,年度次,0,2020-03-06,0,都道府県,20976,2020-04-03,99,その他,99,その他 52 | 0000010207,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010207,G 文化・スポーツ,,,,,年度次,0,2020-03-06,0,全国,20976,2020-04-03,99,その他,99,その他 53 | 0000010208,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010208,H 居住,,,,,年度次,0,2020-03-06,0,全国,91632,2020-03-06,99,その他,99,その他 54 | 0000010208,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010208,H 居住,,,,,年度次,0,2020-03-06,0,都道府県,91632,2020-03-06,99,その他,99,その他 55 | 0000010209,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010209,I 健康・医療,,,,,年度次,0,2020-03-06,0,都道府県,154608,2020-03-06,99,その他,99,その他 56 | 0000010209,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010209,I 健康・医療,,,,,年度次,0,2020-03-06,0,全国,154608,2020-03-06,99,その他,99,その他 57 | 0000010210,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010210,J 福祉・社会保障,,,,,年度次,0,2020-03-06,0,都道府県,71760,2020-03-06,99,その他,99,その他 58 | 0000010210,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010210,J 福祉・社会保障,,,,,年度次,0,2020-03-06,0,全国,71760,2020-03-06,99,その他,99,その他 59 | 0000010211,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010211,K 安全,,,,,年度次,0,2020-05-13,0,全国,105360,2020-05-13,99,その他,99,その他 60 | 0000010211,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010211,K 安全,,,,,年度次,0,2020-05-13,0,都道府県,105360,2020-05-13,99,その他,99,その他 61 | 0000010212,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010212,L 家計,,,,,年度次,0,2020-03-06,0,都道府県,71184,2020-03-06,99,その他,99,その他 62 | 0000010212,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010212,L 家計,,,,,年度次,0,2020-03-06,0,全国,71184,2020-03-06,99,その他,99,その他 63 | 0000010213,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010213,M 生活時間,,,,,年度次,0,2020-03-06,0,全国,8160,2020-03-06,99,その他,99,その他 64 | 0000010213,00200502,社会・人口統計体系,00200,総務省,都道府県データ,社会生活統計指標,,,,,0000010213,M 生活時間,,,,,年度次,0,2020-03-06,0,都道府県,8160,2020-03-06,99,その他,99,その他 65 | 0000020201,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020201,A 人口・世帯,,,,,年度次,0,2020-06-22,0,市区町村,1506060,2020-09-03,99,その他,99,その他 66 | 0000020202,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020202,B 自然環境,,,,,年度次,0,2020-06-22,0,市区町村,340912,2020-09-03,99,その他,99,その他 67 | 0000020203,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020203,C 経済基盤,,,,,年度次,0,2020-06-22,0,市区町村,1632315,2020-09-03,99,その他,99,その他 68 | 0000020204,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020204,D 行政基盤,,,,,年度次,0,2020-06-22,0,市区町村,2901722,2020-09-03,99,その他,99,その他 69 | 0000020205,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020205,E 教育,,,,,年度次,0,2020-06-22,0,市区町村,765930,2020-09-03,99,その他,99,その他 70 | 0000020206,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020206,F 労働,,,,,年度次,0,2020-06-22,0,市区町村,595842,2020-09-03,99,その他,99,その他 71 | 0000020207,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020207,G 文化・スポーツ,,,,,年度次,0,2020-06-22,0,市区町村,34502,2020-09-03,99,その他,99,その他 72 | 0000020208,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020208,H 居住,,,,,年度次,0,2020-06-22,0,市区町村,2549143,2020-09-03,99,その他,99,その他 73 | 0000020209,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020209,I 健康・医療,,,,,年度次,0,2020-06-22,0,市区町村,643839,2020-09-03,99,その他,99,その他 74 | 0000020210,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020210,J 福祉・社会保障,,,,,年度次,0,2020-06-22,0,市区町村,1349274,2020-09-03,99,その他,99,その他 75 | 0000020211,00200502,社会・人口統計体系,00200,総務省,市区町村データ,基礎データ(廃置分合処理済),,,,,0000020211,K 安全,,,,,年度次,0,2020-06-22,0,市区町村,112933,2020-09-03,99,その他,99,その他 76 | 0000020301,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020301,A 人口・世帯,,,,,年度次,0,2020-06-22,0,市区町村,182115,2020-09-03,99,その他,99,その他 77 | 0000020302,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020302,B 自然環境,,,,,年度次,0,2020-06-22,0,市区町村,145692,2020-09-03,99,その他,99,その他 78 | 0000020303,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020303,C 経済基盤,,,,,年度次,0,2020-06-22,0,市区町村,49842,2020-09-03,99,その他,99,その他 79 | 0000020304,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020304,D 行政基盤,,,,,年度次,0,2020-06-22,0,市区町村,76680,2020-09-03,99,その他,99,その他 80 | 0000020305,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020305,E 教育,,,,,年度次,0,2020-06-22,0,市区町村,218538,2020-09-03,99,その他,99,その他 81 | 0000020306,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020306,F 労働,,,,,年度次,0,2020-06-22,0,市区町村,63261,2020-09-03,99,その他,99,その他 82 | 0000020307,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020307,G 文化・スポーツ,,,,,年度次,0,2020-06-22,0,市区町村,34506,2020-09-03,99,その他,99,その他 83 | 0000020308,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020308,H 居住,,,,,年度次,0,2020-06-22,0,市区町村,115020,2020-09-03,99,その他,99,その他 84 | 0000020309,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020309,I 健康・医療,,,,,年度次,0,2020-06-22,0,市区町村,172530,2020-09-03,99,その他,99,その他 85 | 0000020310,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020310,J 福祉・社会保障,,,,,年度次,0,2020-06-22,0,市区町村,7668,2020-09-03,99,その他,99,その他 86 | 0000020311,00200502,社会・人口統計体系,00200,総務省,市区町村データ,社会生活統計指標(廃置分合処理済),,,,,0000020311,K 安全,,,,,年度次,0,2020-06-22,0,市区町村,23004,2020-09-03,99,その他,99,その他 87 | -------------------------------------------------------------------------------- /e_stat/assets/government_statistics_codes.tsv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIERUNE/e_stat_api_tools/a80fa94b4b9c9e7fc61d5c6b7cfbe690f54fe937/e_stat/assets/government_statistics_codes.tsv -------------------------------------------------------------------------------- /e_stat/assets/pref_code.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "prefCode": 1, 4 | "prefName": "北海道" 5 | }, 6 | { 7 | "prefCode": 2, 8 | "prefName": "青森県" 9 | }, 10 | { 11 | "prefCode": 3, 12 | "prefName": "岩手県" 13 | }, 14 | { 15 | "prefCode": 4, 16 | "prefName": "宮城県" 17 | }, 18 | { 19 | "prefCode": 5, 20 | "prefName": "秋田県" 21 | }, 22 | { 23 | "prefCode": 6, 24 | "prefName": "山形県" 25 | }, 26 | { 27 | "prefCode": 7, 28 | "prefName": "福島県" 29 | }, 30 | { 31 | "prefCode": 8, 32 | "prefName": "茨城県" 33 | }, 34 | { 35 | "prefCode": 9, 36 | "prefName": "栃木県" 37 | }, 38 | { 39 | "prefCode": 10, 40 | "prefName": "群馬県" 41 | }, 42 | { 43 | "prefCode": 11, 44 | "prefName": "埼玉県" 45 | }, 46 | { 47 | "prefCode": 12, 48 | "prefName": "千葉県" 49 | }, 50 | { 51 | "prefCode": 13, 52 | "prefName": "東京都" 53 | }, 54 | { 55 | "prefCode": 14, 56 | "prefName": "神奈川県" 57 | }, 58 | { 59 | "prefCode": 15, 60 | "prefName": "新潟県" 61 | }, 62 | { 63 | "prefCode": 16, 64 | "prefName": "富山県" 65 | }, 66 | { 67 | "prefCode": 17, 68 | "prefName": "石川県" 69 | }, 70 | { 71 | "prefCode": 18, 72 | "prefName": "福井県" 73 | }, 74 | { 75 | "prefCode": 19, 76 | "prefName": "山梨県" 77 | }, 78 | { 79 | "prefCode": 20, 80 | "prefName": "長野県" 81 | }, 82 | { 83 | "prefCode": 21, 84 | "prefName": "岐阜県" 85 | }, 86 | { 87 | "prefCode": 22, 88 | "prefName": "静岡県" 89 | }, 90 | { 91 | "prefCode": 23, 92 | "prefName": "愛知県" 93 | }, 94 | { 95 | "prefCode": 24, 96 | "prefName": "三重県" 97 | }, 98 | { 99 | "prefCode": 25, 100 | "prefName": "滋賀県" 101 | }, 102 | { 103 | "prefCode": 26, 104 | "prefName": "京都府" 105 | }, 106 | { 107 | "prefCode": 27, 108 | "prefName": "大阪府" 109 | }, 110 | { 111 | "prefCode": 28, 112 | "prefName": "兵庫県" 113 | }, 114 | { 115 | "prefCode": 29, 116 | "prefName": "奈良県" 117 | }, 118 | { 119 | "prefCode": 30, 120 | "prefName": "和歌山県" 121 | }, 122 | { 123 | "prefCode": 31, 124 | "prefName": "鳥取県" 125 | }, 126 | { 127 | "prefCode": 32, 128 | "prefName": "島根県" 129 | }, 130 | { 131 | "prefCode": 33, 132 | "prefName": "岡山県" 133 | }, 134 | { 135 | "prefCode": 34, 136 | "prefName": "広島県" 137 | }, 138 | { 139 | "prefCode": 35, 140 | "prefName": "山口県" 141 | }, 142 | { 143 | "prefCode": 36, 144 | "prefName": "徳島県" 145 | }, 146 | { 147 | "prefCode": 37, 148 | "prefName": "香川県" 149 | }, 150 | { 151 | "prefCode": 38, 152 | "prefName": "愛媛県" 153 | }, 154 | { 155 | "prefCode": 39, 156 | "prefName": "高知県" 157 | }, 158 | { 159 | "prefCode": 40, 160 | "prefName": "福岡県" 161 | }, 162 | { 163 | "prefCode": 41, 164 | "prefName": "佐賀県" 165 | }, 166 | { 167 | "prefCode": 42, 168 | "prefName": "長崎県" 169 | }, 170 | { 171 | "prefCode": 43, 172 | "prefName": "熊本県" 173 | }, 174 | { 175 | "prefCode": 44, 176 | "prefName": "大分県" 177 | }, 178 | { 179 | "prefCode": 45, 180 | "prefName": "宮崎県" 181 | }, 182 | { 183 | "prefCode": 46, 184 | "prefName": "鹿児島県" 185 | }, 186 | { 187 | "prefCode": 47, 188 | "prefName": "沖縄県" 189 | } 190 | ] 191 | -------------------------------------------------------------------------------- /e_stat/assets/standard_area_codes.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIERUNE/e_stat_api_tools/a80fa94b4b9c9e7fc61d5c6b7cfbe690f54fe937/e_stat/assets/standard_area_codes.csv -------------------------------------------------------------------------------- /e_stat/env_settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pathlib import Path 3 | 4 | from dotenv import load_dotenv 5 | 6 | load_dotenv(verbose=True) 7 | 8 | dotenv_path = Path(__file__) / ".env" 9 | load_dotenv(dotenv_path) 10 | 11 | app_id = os.environ.get("app_id") 12 | -------------------------------------------------------------------------------- /e_stat/lib/__init__.py: -------------------------------------------------------------------------------- 1 | from .area_code import AreaCode 2 | from .gdf_dissolve import GdfDissolve 3 | from .merge_boundary_stats import MergeBoundaryStats 4 | from .pref_code import PrefCode 5 | from .shp_to_geopandas import ShapeToGeoPandas 6 | from .stats_data import StatsData 7 | from .stats_ids import StatsIds 8 | from .stats_meta_data import StatsMetaData 9 | -------------------------------------------------------------------------------- /e_stat/lib/area_code.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import sys 4 | from pathlib import Path 5 | 6 | import pandas as pd 7 | import requests 8 | from tqdm import tqdm 9 | 10 | 11 | class AreaCode: 12 | """標準地域コードクラス""" 13 | 14 | def __init__( 15 | self, 16 | path="./e_stat/assets/standard_area_codes.csv", 17 | encoding="shift-jis", 18 | dtype="str"): 19 | """イニシャライザ 20 | 21 | Args: 22 | path (str): 標準地域コードが格納されたcsvのパス文字列 23 | encoding (str): csv読み込み時のエンコーディング 24 | dtype (dict): カラムのdtype 25 | 26 | """ 27 | self.path = Path(path) 28 | self.df = self._read_csv(self.path, encoding, dtype) 29 | # download_polygon_of_shpが実行されるまでNone 30 | self.download_file_path = None 31 | 32 | def _read_csv(self, path, encoding, dtype): 33 | """指定csvを読み込みDataFrameに変換する 34 | 35 | Args: 36 | path (Path): 標準地域コードが格納されたcsvのpath 37 | encoding (str): csv読み込み時のエンコーディング 38 | dtype (dict): カラムのdtype 39 | 40 | Returns: 41 | pd.DataFrame: csvのDataFrame 42 | 43 | """ 44 | self.df = pd.read_csv(path, encoding=encoding, dtype=dtype) 45 | return self.df 46 | 47 | def _get_row(self, start, stop): 48 | """スライスで行番号を指定して列を取得 49 | 50 | Args: 51 | start (int): スライスの開始行を指定 52 | stop (int): スライスの終了行を指定 53 | 54 | Returns: 55 | pd.DataFrame: 対象の行のみ抽出したDataFrame 56 | 57 | Notes: 58 | 先頭は0行目なので番号指定に注意 59 | 60 | """ 61 | return self.df[start:stop] 62 | 63 | def _get_one_row(self, index): 64 | """行番号を指定して1列を取得 65 | 66 | Args: 67 | index (int): 行番号を指定 68 | 69 | Returns: 70 | pd.DataFrame: 対象の行のみ抽出したDataFrame 71 | 72 | Notes: 73 | 先頭は0行目なので番号指定に注意 74 | 75 | """ 76 | return self._get_row(index, index + 1) 77 | 78 | def _get_columns(self, column_name="標準地域コード"): 79 | """DataFrameから標準地域コードを取得(取得するカラムは上書き可能) 80 | 81 | Args: 82 | column_name (str): 取得するカラムの名称 83 | 84 | Returns: 85 | list: 取得したカラムのリスト 86 | 87 | """ 88 | return list(self.df[column_name]) 89 | 90 | def _text_search(self, column_name, search_word): 91 | """指定カラムから指定ワードで検索する 92 | 93 | Args: 94 | column_name (str): 検索対象のカラム名を指定 95 | search_word (str): 検索ワードを指定 96 | 97 | Returns: 98 | pd.DataFrame: 対象の行のみ抽出したDataFrame 99 | 100 | """ 101 | return self.df[self.df[column_name].str.contains(search_word)] 102 | 103 | def _check_suffix(self, file_path, suffix): 104 | """ファイルの拡張子が指定のものかどうかチェック 105 | 106 | Args: 107 | file_path (Path): ファイルのパス 108 | suffix (str): 対象の拡張子 109 | 110 | """ 111 | if file_path.suffix == suffix: 112 | return True 113 | return False 114 | 115 | def _make_download_path(self, dir_path): 116 | """パス文字列からディレクトリを作成し、Pathオブジェクトを返す 117 | 118 | Args: 119 | dir_path (str): ディレクトリのパス文字列 120 | 121 | Returns: 122 | Path: 作成されたディレクトリのPathオブジェクト 123 | 124 | """ 125 | parent_dir = Path(dir_path) 126 | 127 | if not parent_dir.exists(): 128 | parent_dir.mkdir(parents=True, exist_ok=True) 129 | 130 | return parent_dir 131 | 132 | def _get_file_name_from_response(self, url, response): 133 | """responseのContent-Dispositionからファイル名を取得、できなければURLの末尾をファイル名として返す 134 | 135 | Args: 136 | url (str): リクエストのURL 137 | response (Response): responseオブジェクト 138 | 139 | Returns: 140 | str: ファイル名を返す 141 | 142 | """ 143 | disposition = response.headers["Content-Disposition"] 144 | try: 145 | file_name = re.findall(r"filename.+''(.+)", disposition)[0] 146 | except IndexError: 147 | print("ファイル名が取得できませんでした") 148 | file_name = os.path.basename(url) 149 | return file_name 150 | 151 | def _file_download(self, url, dir_path, overwrite=True): 152 | """URLと保存先ディレクトリを指定してファイルをダウンロード 153 | 154 | Args: 155 | url (str): ダウンロードリンク 156 | dir_path (str): 保存するディレクトリのパス文字列 157 | overwrite (bool): ファイル上書きオプション。Trueなら上書き 158 | 159 | Returns: 160 | Path: ダウンロードファイルのパスオブジェクト 161 | 162 | Notes: 163 | すでにファイルが存在していて、overwrite=Falseなら何もせず 164 | ファイルパスを返す 165 | 166 | """ 167 | res = requests.get(url, stream=True) 168 | 169 | parent_dir = self._make_download_path(dir_path) 170 | file_name = self._get_file_name_from_response(url, res) 171 | download_path = parent_dir / file_name 172 | 173 | if download_path.exists() and not overwrite: 174 | print("ファイルがすでに存在し、overwrite=Falseなのでダウンロードを中止します。") 175 | return download_path 176 | 177 | # content-lengthは必ず存在するわけでは無いためチェック 178 | try: 179 | file_size = int(res.headers['content-length']) 180 | except KeyError: 181 | file_size = None 182 | progress_bar = tqdm(total=file_size, unit="B", unit_scale=True) 183 | 184 | if res.status_code == 200: 185 | print(f"{url=}, {res.status_code=}") 186 | print(f"{file_name}のダウンロードを開始します") 187 | with download_path.open('wb') as file: 188 | for chunk in res.iter_content(chunk_size=1024): 189 | file.write(chunk) 190 | progress_bar.update(len(chunk)) 191 | progress_bar.close() 192 | return download_path 193 | else: 194 | print(f"{url=}, {res.status_code=}") 195 | print("正常にリクエストできませんでした。システムを終了します。") 196 | sys.exit(1) 197 | 198 | def download_polygon_of_shp(self, area_code, dir_path, overwrite=True): 199 | """指定された標準地域コードのshpを格納したzipファイルをダウンロード 200 | 201 | Args: 202 | area_code (str): ダウンロード対象の標準地域コード 203 | dir_path (str): ファイルを格納するディレクトリ 204 | overwrite (bool): ファイル上書きオプション。Trueなら上書き 205 | 206 | Notes: 207 | すでにファイルが存在していて、overwrite=Falseなら何もせず 208 | self.download_file_pathにファイルパスを保存する 209 | 210 | """ 211 | area_code_to_int = area_code 212 | base_url = f"https://www.e-stat.go.jp/gis/statmap-search/data?" 213 | query_params = f"dlserveyId=A002005212015&code={area_code_to_int}&coordSys=1&format=shape&downloadType=5" 214 | request_url = base_url + query_params 215 | self.download_file_path = self._file_download( 216 | request_url, dir_path, overwrite) 217 | -------------------------------------------------------------------------------- /e_stat/lib/gdf_dissolve.py: -------------------------------------------------------------------------------- 1 | import geopandas as gpd 2 | 3 | 4 | class GdfDissolve: 5 | """gdfのジオメトリをマージするためのクラス""" 6 | 7 | def __init__(self, gdf, columns): 8 | """イニシャライザ 9 | 10 | Args: 11 | gdf (gpd.geodataframe.GeoDataFrame): geopandasのデータフレーム 12 | columns (list): 抽出対象となるカラム名のリスト 13 | 14 | """ 15 | self.org_gdf = gdf 16 | self.columns = columns 17 | self.new_gdf: gpd.GeoDataFrame = self._extraction_gdf() 18 | 19 | def _extraction_gdf(self): 20 | """gdfから指定キーのみ抜き出す 21 | 22 | Returns: 23 | gpd.GeoDataFrame: geopandasのデータフレーム 24 | 25 | """ 26 | return self.org_gdf[self.columns] 27 | 28 | def join_columns(self, new_column_name, org_column, add_column): 29 | """指定カラムを連結する 30 | 31 | Args: 32 | new_column_name (str): 新規作成するカラム名 33 | org_column (str): 連結元のカラム 34 | add_column (str): 連結させたいカラム 35 | 36 | """ 37 | self.new_gdf[new_column_name] = self.new_gdf[org_column] + \ 38 | self.new_gdf[add_column] 39 | 40 | def dissolve_poly(self, column): 41 | """指定カラム名のフィールド値が同じの場合にジオメトリを結合 42 | 43 | Args: 44 | column (str): キーとなるカラムの名称 45 | 46 | """ 47 | print(f"gdfを指定キー({column})で結合します。") 48 | # dissolveで結合したキーはインデックスになってしまうのでreset_index()でカラムに変換 49 | self.new_gdf: gpd.GeoDataFrame = self.new_gdf.dissolve( 50 | by=column).reset_index() 51 | -------------------------------------------------------------------------------- /e_stat/lib/merge_boundary_stats.py: -------------------------------------------------------------------------------- 1 | import geopandas as gpd 2 | import pandas as pd 3 | 4 | from ..utils import csv_string_to_df, get_api_response 5 | 6 | 7 | class MergeBoundaryStats: 8 | """境界データと統計データをマージするためのクラス""" 9 | 10 | def __init__( 11 | self, 12 | app_id, 13 | stats_table_id, 14 | boundary_gdf, 15 | area, 16 | class_code, 17 | year): 18 | """イニシャライザ 19 | 20 | Args: 21 | app_id (str): e-statAPIのAPIkey 22 | stats_table_id (str): 取得したい統計情報の統計表ID 23 | boundary_gdf (gpd.GeoDataFrame): 境界データのgdf 24 | stats_df (pd.DataFrame): 統計データのdf 25 | area (str): 標準地域コード 26 | class_code (str): 統計表メタデータのクラスコード 27 | year (str): データを取得したい年度 28 | 29 | """ 30 | self.app_id = app_id 31 | 32 | self.stats_table_id = stats_table_id 33 | self.boundary_gdf = boundary_gdf 34 | 35 | self.area = area 36 | self.class_code = class_code 37 | self.year = year + "100000" 38 | 39 | self.detail_url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData" \ 40 | f"?appId={self.app_id}" \ 41 | f"&cdArea={self.area}" \ 42 | f"&cdCat01={self.class_code}" \ 43 | f"&cdTime={self.year}" \ 44 | f"&statsDataId={self.stats_table_id}" \ 45 | f"&lang=J&metaGetFlg=N&cntGetFlg=N&explanationGetFlg=N&annotationGetFlg=N§ionHeaderFlg=2" 46 | self.stats_df = self._extraction_only_year(self._create_stats_df()) 47 | self.merged_df = self._merge_df() 48 | 49 | def _create_stats_df(self): 50 | """統計表をAPIから取得して、データフレームとして返す 51 | 52 | Returns: 53 | pd.DataFrame: 統計表のデータフレーム 54 | 55 | """ 56 | print(f"統計表を取得します。URL={self.detail_url}") 57 | res = get_api_response(self.detail_url) 58 | row_text = res.text 59 | return csv_string_to_df(row_text) 60 | 61 | def _extraction_only_year(self, df): 62 | return df[df["time_code"].str.startswith(str(self.year))] 63 | 64 | def _merge_df(self): 65 | return pd.merge( 66 | self.boundary_gdf, 67 | self.stats_df, 68 | left_on='AREA_CODE', 69 | right_on='area_code') 70 | -------------------------------------------------------------------------------- /e_stat/lib/pref_code.py: -------------------------------------------------------------------------------- 1 | import json 2 | import sys 3 | from pathlib import Path 4 | import pandas as pd 5 | 6 | 7 | class PrefCode: 8 | """都道府県コードクラス""" 9 | 10 | def __init__(self): 11 | """イニシャライザ 12 | 13 | """ 14 | self.__pref_code_json_path = Path("./e_stat/assets/pref_code.json") 15 | self.__pref_code_df = self._pref_json_to_df() 16 | 17 | def _read_json(self): 18 | """jsonを読み込んで辞書に変換する 19 | 20 | Returns: 21 | Union[dict, list]: jsonを変換した辞書またはリスト 22 | 23 | """ 24 | json_path = self.__pref_code_json_path 25 | with json_path.open() as file: 26 | return json.load(file) 27 | 28 | def _dict_in_list_to_df(self, dicts): 29 | """フラットな同じキーを持つ辞書のリストをdfに変換 30 | 31 | Args: 32 | dicts (list): 辞書のリスト 33 | 34 | Returns: 35 | pd.DataFrame: 変換されたdf 36 | 37 | """ 38 | return pd.DataFrame(dicts) 39 | 40 | def _pref_json_to_df(self): 41 | if isinstance(self._read_json(), list): 42 | return self._dict_in_list_to_df(self._read_json()) 43 | print(f"{self.__pref_code_json_path}はdfに変換できません。システムを終了します。") 44 | sys.exit(1) 45 | 46 | def code_to_name(self, pref_code): 47 | """都道府県コードを都道府県名に変換する 48 | 49 | Args: 50 | pref_code (int): 都道府県コード 51 | 52 | Returns: 53 | str: 都道府県名 54 | 55 | """ 56 | df = self.__pref_code_df 57 | try: 58 | pref_name = list(df[df["prefCode"] == pref_code]["prefName"])[0] 59 | return pref_name 60 | except BaseException: 61 | print(f"{df}からデータを抽出できません。システムを終了します。") 62 | sys.exit(1) 63 | 64 | def name_to_code(self, pref_name): 65 | """都道府県名を都道府県コードに変換する 66 | 67 | Args: 68 | pref_name (str): 都道府県名 69 | 70 | Returns: 71 | int: 都道府県コード 72 | 73 | """ 74 | df = self.__pref_code_df 75 | try: 76 | pref_code = list(df[df["prefName"] == pref_name]["prefCode"])[0] 77 | return pref_code 78 | except BaseException: 79 | print(f"{df}からデータを抽出できません。システムを終了します。") 80 | sys.exit(1) 81 | -------------------------------------------------------------------------------- /e_stat/lib/shp_to_geopandas.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from pathlib import Path 3 | 4 | import geopandas as gpd 5 | 6 | 7 | class ShapeToGeoPandas: 8 | """シェープファイルをGeoDataframeに変換して指定形式で吐き出すクラス""" 9 | 10 | def __init__(self, shp_path): 11 | """イニシャライザ 12 | 13 | Args: 14 | shp_path (str): .shpが格納されているzipのパス文字列(.shpファイルの直接参照も可) 15 | 16 | """ 17 | self.shp_path = shp_path 18 | self.gdf = self._file_to_gdf(shp_path) 19 | 20 | def _suffix_check(self, path, target_suffix): 21 | """ファイルの拡張子が指定のものかチェック 22 | 23 | Args: 24 | path (str): チェック対象ファイルのパス文字列 25 | target_suffix (str): 対象の拡張子 26 | 27 | Returns: 28 | bool: target_suffixとファイルの拡張子が一致すればTrue 29 | 30 | """ 31 | file_path = Path(path) 32 | if not file_path.is_file(): 33 | print("パスはファイルを指定してください。システムを終了します。") 34 | sys.exit(1) 35 | if file_path.suffix.lstrip('.') == target_suffix: 36 | return True 37 | return False 38 | 39 | def _is_zip_file(self, path): 40 | """対象ファイルの拡張子がzipかどうかチェック 41 | 42 | Args: 43 | path (str): チェック対象ファイルのパス文字列 44 | 45 | Returns: 46 | bool: ファイル拡張子がzipならTrue 47 | 48 | """ 49 | return self._suffix_check(path, "zip") 50 | 51 | def _is_shp_file(self, path): 52 | """対象ファイルの拡張子がshpかどうかチェック 53 | 54 | Args: 55 | path (str): チェック対象ファイルのパス文字列 56 | 57 | Returns: 58 | bool: ファイル拡張子がshpならTrue 59 | 60 | """ 61 | return self._suffix_check(path, "shp") 62 | 63 | def _shp_to_gdf(self, path): 64 | """shpファイルをGeoDataframeに変換する 65 | 66 | Args: 67 | path (str): shpファイルのパス文字列 68 | 69 | Returns: 70 | gpd.GeoDataFrame: shpファイルを変換したgdf 71 | 72 | """ 73 | path_str = str(Path(path).resolve()) 74 | return gpd.read_file(path_str) 75 | 76 | def _zip_to_gdf(self, path): 77 | """zipファイルをGeoDataframeに変換する 78 | 79 | Args: 80 | path (str): zipファイルのパス文字列 81 | 82 | Returns: 83 | gpd.GeoDataFrame: shpファイルを変換したgdf 84 | 85 | """ 86 | path_str = str(Path(path).resolve()) 87 | return gpd.read_file("zip://" + path_str) 88 | 89 | def _file_to_gdf(self, path): 90 | """.shp及び.shpが格納されたzipファイルを読み込みGeoDataFrameを返す 91 | 92 | Args: 93 | path (str): .shp及び.shpが格納された.zipのパス文字列 94 | 95 | Returns: 96 | gpd.GeoDataFrame: shpファイルを変換したgdf 97 | 98 | Notes: 99 | .shpか.zip以外のファイルを指定した時には異常終了 100 | 101 | """ 102 | print("読み込みファイル:", str(Path(path).resolve())) 103 | 104 | if self._is_shp_file(path) is True: 105 | print("shpファイルをgdfに変換します") 106 | return self._shp_to_gdf(path) 107 | 108 | if self._is_zip_file(path) is True: 109 | print(".zipファイル内のshpファイルをgdfに変換します") 110 | return self._zip_to_gdf(path) 111 | 112 | print("読み込み可能ファイルは.shpか.zipのみです。システムを終了します。") 113 | sys.exit(1) 114 | -------------------------------------------------------------------------------- /e_stat/lib/stats_data.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from ..utils import csv_string_to_df, df_to_flatten_d_list, extraction_df, get_api_response, output_csv_from_df 4 | 5 | 6 | class StatsData: 7 | """統計情報を取り扱うクラス""" 8 | 9 | def __init__( 10 | self, 11 | app_id, 12 | stats_table_id, 13 | output_dir, 14 | areas, 15 | class_codes, 16 | years): 17 | """イニシャライザ 18 | 19 | Args: 20 | app_id (str): e-statAPIのAPIkey 21 | stats_table_id (str): 取得したい統計情報の統計表ID 22 | output_dir (str): ファイル吐き出し先ディレクトリのパス文字列 23 | areas (list): 標準地域コードのリスト 24 | class_codes (list): 統計表メタデータのクラスコードのリスト(取得したい詳細項目) 25 | years (list): データを取得したい年度のリスト 26 | 27 | """ 28 | # api_key 29 | self.app_id = app_id 30 | 31 | # 統計情報 32 | self.stats_table_id = stats_table_id 33 | self.output_dir = output_dir 34 | 35 | self.areas = ",".join(areas) 36 | self.class_codes = ",".join(class_codes) 37 | self.years = ",".join([str(y) + "100000" for y in years]) 38 | 39 | self.detail_url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData" \ 40 | f"?appId={self.app_id}" \ 41 | f"&cdArea={self.areas}" \ 42 | f"&cdCat01={self.class_codes}" \ 43 | f"&cdTime={self.years}" \ 44 | f"&statsDataId={self.stats_table_id}" \ 45 | f"&lang=J&metaGetFlg=N&cntGetFlg=N&explanationGetFlg=N&annotationGetFlg=N§ionHeaderFlg=2" 46 | 47 | self.stats_df = self._create_stats_df() 48 | 49 | def _create_stats_df(self): 50 | """統計表をAPIから取得して、データフレームとして返す 51 | 52 | Returns: 53 | pd.DataFrame: 統計表のデータフレーム 54 | 55 | """ 56 | print(f"統計表を取得します。URL={self.detail_url}") 57 | res = get_api_response(self.detail_url) 58 | row_text = res.text 59 | return csv_string_to_df(row_text) 60 | 61 | def to_dict( 62 | self, 63 | columns=[ 64 | "cat01_code", 65 | "地域", 66 | "調査年", 67 | "unit", 68 | "value"]): 69 | """統計データのdfからコード必要なカラムのみの辞書のリストで取得 70 | 71 | Args: 72 | columns (list): 抽出対象のカラム名 73 | 74 | Returns: 75 | list: 辞書のリスト 76 | 77 | Notes: 78 | columnsに空のリストを渡すとカラムを削らずそのまま辞書として返す 79 | 80 | """ 81 | df = self.stats_df 82 | # columnsを空にするとカラムを削らずそのまま辞書として返す 83 | if not columns: 84 | df_to_flatten_d_list(df) 85 | try: 86 | extracted_df = extraction_df( 87 | df, columns) 88 | except KeyError: 89 | print("データフレームに存在するカラム名を指定してください。システムを終了します。") 90 | sys.exit(1) 91 | return df_to_flatten_d_list(extracted_df) 92 | 93 | def to_csv( 94 | self, 95 | path="./e_stat/assets/", 96 | file_name="stats.csv"): 97 | """統計データのdfをcsvファイルとして保存する 98 | 99 | Args: 100 | path (str): csvを保存するパス文字列 101 | file_name (str): 保存するファイルの名称 102 | 103 | """ 104 | df = self.stats_df 105 | output_csv_from_df(df, path, file_name) 106 | -------------------------------------------------------------------------------- /e_stat/lib/stats_ids.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from pathlib import Path 3 | 4 | import pandas as pd 5 | 6 | from ..utils import csv_file_to_df, csv_string_to_df, df_to_flatten_d_list, extraction_df, get_api_response, \ 7 | output_csv_from_df, stats_res_formatter, validation_stats_url 8 | 9 | 10 | class StatsIds: 11 | """統計表ID一覧を扱うクラス""" 12 | 13 | def __init__( 14 | self, 15 | app_id, 16 | gov_stats_code, 17 | necessary_columns=[ 18 | "政府統計コード", 19 | "政府統計名"]): 20 | """イニシャライザ 21 | 22 | Args: 23 | app_id (str): e-statAPIのAPIkey 24 | gov_stats_code (str): 政府統計コード 25 | necessary_columns (list): 政府統計コードの中の必要なカラム名を指定 26 | 27 | """ 28 | # api_key 29 | self.app_id = app_id 30 | 31 | # 取得する政府統計コード 32 | self.gov_stats_code = gov_stats_code 33 | 34 | # 政府統計コード一覧 35 | self.__gov_stats_codes_csv_path = "./e_stat/assets/government_statistics_codes.tsv" 36 | self.gov_stats_codes_df: pd.DataFrame = self._read_gov_stats_codes_tsv( 37 | self.__gov_stats_codes_csv_path, "shift-jis") 38 | self.__necessary_columns = necessary_columns 39 | self.gov_stats_codes_dict = self._gov_stats_codes_to_dict() 40 | 41 | # 統計表ID一覧 42 | # デフォルトでGISで扱いやすい社会・人口統計体系(00200502)のデータフレームを生成する 43 | self.__stats_table_ids_url = f"http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsList" \ 44 | f"?appId={self.app_id}&lang=J&statsCode={self.gov_stats_code}" \ 45 | f"&searchKind=1&explanationGetFlg=N" 46 | self.__default_stats_table_ids_csv = "./e_stat/assets/default_stats_table_ids.csv" 47 | self.default_stats_table_ids_df = csv_file_to_df( 48 | self.__default_stats_table_ids_csv) 49 | 50 | self.stats_table_ids_df = self._create_stats_table_ids_df() 51 | 52 | """プロパティ""" 53 | 54 | @property 55 | def stats_table_ids_url(self): 56 | return self.__stats_table_ids_url 57 | 58 | @stats_table_ids_url.setter 59 | def stats_table_ids_url(self, url): 60 | if validation_stats_url(url): 61 | self.__stats_table_ids_url = url 62 | else: 63 | print("stats_urlにはe-statのURLを入力してください。") 64 | 65 | """政府統計コード""" 66 | 67 | def _read_gov_stats_codes_tsv(self, path, encoding): 68 | """政府統計コード一覧のdfを生成する 69 | 70 | Args: 71 | path (str): dfに変換するtsvのパス文字列 72 | 73 | Returns: 74 | pd.DataFrame: pandasのデータフレーム 75 | 76 | """ 77 | file_path = Path(path) 78 | resolve_path_str = str(file_path.resolve()) 79 | return pd.read_table(resolve_path_str, encoding=encoding, dtype=str) 80 | 81 | def _gov_stats_codes_to_dict(self): 82 | """政府統計コードの名称とコードを辞書のリストで取得する 83 | 84 | Returns: 85 | dict: データフレームから必要なカラムのみ抜き出した辞書 86 | 87 | """ 88 | try: 89 | extracted_df = extraction_df( 90 | self.gov_stats_codes_df, self.__necessary_columns) 91 | except KeyError: 92 | print("tsvに存在するカラム名を指定してください。システムを終了します。") 93 | sys.exit(1) 94 | return df_to_flatten_d_list(extracted_df) 95 | 96 | """統計表ID一覧""" 97 | 98 | def _create_stats_table_ids_df(self): 99 | """統計表ID一覧をAPIから取得して、データフレームとして返す 100 | 101 | Returns: 102 | pd.DataFrame: 統計表情報一覧のデータフレーム 103 | 104 | """ 105 | res = get_api_response(self.__stats_table_ids_url) 106 | row_text = res.text 107 | csv_str = self._stats_table_ids_res_formatting(row_text) 108 | df = csv_string_to_df(csv_str) 109 | self.stats_table_ids_df = df 110 | return df 111 | 112 | def stats_table_ids_to_dict( 113 | self, 114 | columns=[ 115 | "TABLE_INF", 116 | "STAT_CODE", 117 | "STAT_NAME", 118 | "TITLE", 119 | "COLLECT_AREA"]): 120 | """統計表ID一覧のdfからコード必要なカラムのみの辞書のリストで取得 121 | 122 | Args: 123 | columns (list): 抽出対象のカラム名 124 | 125 | Returns: 126 | list: 辞書のリスト 127 | 128 | Notes: 129 | columnsに空のリストを渡すとカラムを削らずそのまま辞書として返す 130 | 131 | """ 132 | df = self._return_stats_table_ids_df() 133 | # columnsを空にするとカラムを削らずそのまま辞書として返す 134 | if not columns: 135 | df_to_flatten_d_list(df) 136 | try: 137 | extracted_df = extraction_df( 138 | df, columns) 139 | except KeyError: 140 | print("データフレームに存在するカラム名を指定してください。システムを終了します。") 141 | sys.exit(1) 142 | return df_to_flatten_d_list(extracted_df) 143 | 144 | def stats_table_ids_to_csv( 145 | self, 146 | path="./e_stat/assets/", 147 | file_name="stats_table_ids.csv"): 148 | """統計表ID一覧のdfをcsvファイルとして保存する 149 | 150 | Args: 151 | path (str): csvを保存するパス文字列 152 | file_name (str): 保存するファイルの名称 153 | 154 | """ 155 | df = self._return_stats_table_ids_df() 156 | output_csv_from_df(df, path, file_name) 157 | 158 | def _return_stats_table_ids_df(self): 159 | """stats_table_ids_dfが存在すればstats_table_ids_dfを、なければdefault_stats_table_ids_dfを返す 160 | 161 | Returns: 162 | pd.DataFrame: 統計表ID一覧のデータフレーム 163 | 164 | """ 165 | return self.default_stats_table_ids_df if self.stats_table_ids_df is None else self.stats_table_ids_df 166 | 167 | def _stats_table_ids_res_formatting(self, text): 168 | """統計表ID一覧取得APIのcsv風のレスポンスの先頭を削除してcsv形式の文字列を返す 169 | 170 | Args: 171 | text (str): 統計表ID一覧取得APIのcsv風のレスポンス 172 | 173 | Returns: 174 | str: 統計表ID一覧取得APIのcsv部分のみを抽出した文字列 175 | 176 | """ 177 | pettern_row_text = r'.*"STAT_INF"\n(.*)' 178 | return stats_res_formatter(text, pettern_row_text) 179 | -------------------------------------------------------------------------------- /e_stat/lib/stats_meta_data.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from ..utils import csv_string_to_df, df_to_flatten_d_list, extraction_df, get_api_response, output_csv_from_df, \ 4 | stats_res_formatter 5 | 6 | 7 | class StatsMetaData: 8 | """統計表情報の詳細情報(メタデータ)を取り扱うクラス""" 9 | 10 | def __init__(self, app_id, stats_table_id): 11 | """イニシャライザ 12 | 13 | Args: 14 | app_id (str): e-statAPIのAPIkey 15 | stats_table_id (str): 取得したい統計情報の統計表ID 16 | 17 | """ 18 | # api_key 19 | self.app_id = app_id 20 | 21 | # 統計情報 22 | self.stats_data_id = stats_table_id 23 | self.default_url = f"http://api.e-stat.go.jp/rest/3.0/app/getSimpleMetaInfo" \ 24 | f"?appId={self.app_id}" \ 25 | f"&lang=J&statsDataId={self.stats_data_id}&explanationGetFlg=N" 26 | self.stats_meta_data_df = self._create_stats_meta_data_df() 27 | 28 | def _create_stats_meta_data_df(self): 29 | """統計表ID一覧をAPIから取得して、データフレームとして返す 30 | 31 | Returns: 32 | pd.DataFrame: 統計表情報一覧のデータフレーム 33 | 34 | """ 35 | res = get_api_response(self.default_url) 36 | row_text = res.text 37 | csv_str = self._stats_meta_data_res_formatting(row_text) 38 | df = csv_string_to_df(csv_str) 39 | self.stats_meta_data_df = df 40 | return df 41 | 42 | def _stats_meta_data_res_formatting(self, text): 43 | """統計表ID一覧取得APIのcsv風のレスポンスの先頭を削除してcsv形式の文字列を返す 44 | 45 | Args: 46 | text (str): 統計表ID一覧取得APIのcsv風のレスポンス 47 | 48 | Returns: 49 | str: 統計表ID一覧取得APIのcsv部分のみを抽出した文字列 50 | 51 | """ 52 | pattern_row_text = r'.*"CLASS_INF"\n(.*)' 53 | return stats_res_formatter(text, pattern_row_text) 54 | 55 | def to_dict( 56 | self, 57 | columns=[ 58 | "CLASS_OBJ_NAME", 59 | "CLASS_CODE", 60 | "CLASS_NAME"]): 61 | """統計表メタデータのdfからコード必要なカラムのみの辞書のリストで取得 62 | 63 | Args: 64 | columns (list): 抽出対象のカラム名 65 | 66 | Returns: 67 | list: 辞書のリスト 68 | 69 | Notes: 70 | columnsに空のリストを渡すとカラムを削らずそのまま辞書として返す 71 | 72 | """ 73 | df = self.stats_meta_data_df 74 | # columnsを空にするとカラムを削らずそのまま辞書として返す 75 | if not columns: 76 | df_to_flatten_d_list(df) 77 | try: 78 | extracted_df = extraction_df( 79 | df, columns) 80 | except KeyError: 81 | print("データフレームに存在するカラム名を指定してください。システムを終了します。") 82 | sys.exit(1) 83 | return df_to_flatten_d_list(extracted_df) 84 | 85 | def to_csv( 86 | self, 87 | path="./e_stat/assets/", 88 | file_name="meta_data.csv"): 89 | """統計表メタデータのdfをcsvファイルとして保存する 90 | 91 | Args: 92 | path (str): csvを保存するパス文字列 93 | file_name (str): 保存するファイルの名称 94 | 95 | """ 96 | df = self.stats_meta_data_df 97 | output_csv_from_df(df, path, file_name) 98 | -------------------------------------------------------------------------------- /e_stat/utils/__init__.py: -------------------------------------------------------------------------------- 1 | from .df_utils import * 2 | from .e_stat_utils import * 3 | from .gdf_geojson import * 4 | -------------------------------------------------------------------------------- /e_stat/utils/df_utils.py: -------------------------------------------------------------------------------- 1 | import io 2 | from pathlib import Path 3 | 4 | import pandas as pd 5 | import requests 6 | 7 | 8 | def get_api_response(url): 9 | """URLを指定してレスポンスオブジェクトを返す 10 | 11 | Args: 12 | url (str): URL 13 | 14 | Returns: 15 | Response: レスポンスオブジェクト 16 | 17 | """ 18 | return requests.get(url) 19 | 20 | 21 | def extraction_df(df, columns): 22 | """dfから指定キーのみ抜き出す 23 | 24 | Args: 25 | df (pd.DataFrame): データフレーム 26 | columns (list): 必要なカラム 27 | 28 | Returns: 29 | pd.DataFrame: pandasのデータフレーム 30 | 31 | """ 32 | return df[columns] 33 | 34 | 35 | def df_to_flatten_d_list(df): 36 | """データフレームを辞書のリストに加工する 37 | 38 | Args: 39 | df (pd.DataFrame): 辞書のリストへ変換したいdf 40 | 41 | Returns: 42 | list: データフレームのカラムを格納した辞書のリスト 43 | 44 | """ 45 | _dict = df.to_dict('index') 46 | return [v for v in _dict.values()] 47 | 48 | 49 | def csv_file_to_df(path): 50 | """csvファイルをデータフレームに変換 51 | 52 | Args: 53 | path (str): csvのパス文字列 54 | 55 | Returns: 56 | pd.DataFrame: csvファイルを変換したdf 57 | 58 | """ 59 | csv_path = Path(path) 60 | return pd.read_csv(str(csv_path.resolve()), 61 | encoding="utf-8", dtype=str) 62 | 63 | 64 | def csv_string_to_df(csv_str): 65 | """csv形式の文字列オブジェクトをデータフレームに変換 66 | 67 | Args: 68 | csv_str (str): csv形式の文字列オブジェクト 69 | 70 | Returns: 71 | pd.DataFrame: csv形式の文字列オブジェクトを変換したdf 72 | 73 | """ 74 | return pd.read_csv( 75 | io.StringIO(csv_str), 76 | encoding="shift-jis", 77 | dtype=str) 78 | 79 | 80 | def output_csv_from_df(df, path, file_name): 81 | """データフレームを受け取り、csvを書き出す 82 | 83 | Args: 84 | df (pd.DataFrame): 書き出し対象のデータフレーム 85 | path (str): アウトプットするディレクトリのパス文字列 86 | file_name (str): 書き出すファイルの名称 87 | 88 | """ 89 | dir_path = Path(path) 90 | if not dir_path.exists(): 91 | dir_path.mkdir(parents=True, exist_ok=True) 92 | output_path = dir_path / file_name 93 | df.to_csv(str(output_path.resolve()), 94 | encoding="utf-8", index=False) 95 | print(f"{output_path.resolve()}を書き出しました。") 96 | -------------------------------------------------------------------------------- /e_stat/utils/e_stat_utils.py: -------------------------------------------------------------------------------- 1 | import re 2 | import sys 3 | from urllib.parse import urlparse 4 | 5 | import requests 6 | 7 | 8 | def stats_res_formatter(text, pattern_row_text): 9 | """e-statAPIのcsv風のレスポンスの先頭を削除してcsv形式の文字列を返す 10 | 11 | Args: 12 | text (str): e-statAPIのcsv風のレスポンス 13 | pattern_row_text (str): マッチさせたいパターンのrow文字列 14 | 15 | Returns: 16 | str: e-statAPIのcsv部分のみを抽出した文字列 17 | 18 | """ 19 | # 第二引数にre.Sを与えることで.*が改行を認識できるようにする 20 | pattern = re.compile(pattern_row_text, re.S) 21 | if match := pattern.match(text): 22 | return match.groups()[0] 23 | else: 24 | print("レスポンスの文字列を整形できません。システムを終了します。") 25 | sys.exit(1) 26 | 27 | 28 | def validation_stats_url(url): 29 | """URLがe-statAPIのものであるか判定 30 | 31 | Args: 32 | url (str): URL 33 | 34 | Returns: 35 | bool: e-statのURL風ならTrue 36 | 37 | """ 38 | if not isinstance(url, str): 39 | return False 40 | if not len(urlparse(url).scheme) > 0: 41 | return False 42 | if not urlparse(url).netloc == "api.e-stat.go.jp": 43 | return False 44 | try: 45 | requests.head(url) 46 | except requests.exceptions.MissingSchema: 47 | return False 48 | return True 49 | -------------------------------------------------------------------------------- /e_stat/utils/gdf_geojson.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | import geojson 4 | import geopandas as gpd 5 | 6 | 7 | def df_to_geojson(gdf): 8 | """gdfから指定されたディレクトリに指定名でGeoJSONを作成する 9 | 10 | Args: 11 | gdf (gpd.GeoDataFrame): 書き出し元のgdf 12 | 13 | Returns: 14 | str: geojson形式の文字列 15 | 16 | """ 17 | print("gdfをgeojsonに変換します。") 18 | return gdf.to_json() 19 | 20 | 21 | def geojson_str_to_obj(geojson_str): 22 | """ 23 | 24 | Args: 25 | geojson_str (str): geojson形式の文字列 26 | 27 | Returns: 28 | geojson.feature.FeatureCollection: geojsonオブジェクト 29 | 30 | """ 31 | return geojson.loads(geojson_str) 32 | 33 | 34 | def write_geojson(geojson_obj, output_dir, file_name): 35 | """geojsonオブジェクトをファイル出力する 36 | 37 | Args: 38 | geojson_obj (geojson): GeoJSONオブジェクト 39 | output_dir (str): 書き出し先ディレクトリのパス文字列 40 | file_name (str): 作成するファイルの名称 41 | 42 | """ 43 | output_dit_obj = Path(output_dir) 44 | data_path = output_dit_obj / file_name 45 | if not output_dit_obj.exists(): 46 | output_dit_obj.mkdir(parents=True, exist_ok=True) 47 | with data_path.open("w") as file: 48 | geojson.dump(geojson_obj, file, indent=2, ensure_ascii=False) 49 | print(f"{data_path.resolve()}を書き出しました。") 50 | -------------------------------------------------------------------------------- /ids.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | pipenv run python -m e_stat ids \ 4 | -g 00200502 \ 5 | -o ./created -------------------------------------------------------------------------------- /main_script_run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | pipenv run python -m e_stat --help -------------------------------------------------------------------------------- /merge_boundary.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | pipenv run python -m e_stat merge-boundary \ 4 | -p 北海道 \ 5 | -d ./download_file \ 6 | -a 01101 \ 7 | -c A1101 \ 8 | -y 2000 \ 9 | -st 0000020101 \ 10 | -o ./created -------------------------------------------------------------------------------- /meta_data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | pipenv run python -m e_stat meta \ 4 | -st 0000010101 \ 5 | -o ./created -------------------------------------------------------------------------------- /stats_data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | pipenv run python -m e_stat stats \ 4 | -a 01101,01105,01107,01203 \ 5 | -c A1101,A110101,A110102,A1102,A110201,A110202 \ 6 | -y 2000,2010 \ 7 | -st 0000020101 \ 8 | -o ./created 9 | --------------------------------------------------------------------------------