港湾統計のExcelデータをPython(GoogleColab)で集計してみる

はじめに

港湾統計は国土交通省ホームページにEXCELデータが公表されているが、ダウンロードして加工して集計して、という作業が面倒だったので、pythonで自動化してみた。

取扱貨物量(総計)

ありがたいことに、各年度のExcelデータの様式が統一されているので、エクセルデータのURLを指定して、DataFrameに格納する関数を作成する。

def  get_cargo(time,url):
  # ブックの指定
  input_file_name = url
  input_book = pd.ExcelFile(input_file_name)

  # 統計結果は2番目のシート、上から2行は無視
  input_sheet_name = input_book.sheet_names
  df = input_book.parse(input_sheet_name[1],skiprows = 2)

  # 都道府県と港湾で集計
  df = df.groupby(['都道府県','港湾']).agg({'合計':  'sum','輸出':  'sum','輸入':  'sum','移出':  'sum','移入':  'sum'})

  # 列の値を行にstack
  df = pd.DataFrame(df.stack()).reset_index()

  # 列名の整形
  column = f'取扱貨物量【{time}】'
  df['港湾'] = df.apply(lambda x:  '{}_{}'.format(x['都道府県'],x['港湾'])  if x['港湾'] != '合計'  else x['都道府県'],  1)
  df[column] = df.apply(lambda x: x[0],  1)
  df['種類'] = df.apply(lambda x: x['level_2'],  1)

 
  # 必要な列だけ抽出
  df = df[['都道府県','港湾','種類',column]]

  return df

年度とURLを指定して関数をテスト

time = '2020年'
url = 'https://www.mlit.go.jp/k-toukei/content/001448034.xlsx'

df_2020 = get_cargo(time,url)
df_2020

あとは、各年次のURLをセットして、

params_cargo = [
  {  'time'  :  '2012年'  ,  'url'  :  'https://www.mlit.go.jp/common/001277668.xls'  },
  {  'time'  :  '2013年'  ,  'url'  :  'https://www.mlit.go.jp/common/001277684.xls'  },
  {  'time'  :  '2014年'  ,  'url'  :  'https://www.mlit.go.jp/common/001277699.xls'  },
  {  'time'  :  '2015年'  ,  'url'  :  'https://www.mlit.go.jp/common/001380149.xlsx'  },
  {  'time'  :  '2016年'  ,  'url'  :  'https://www.mlit.go.jp/k-toukei/content/001448496.xlsx'  },
  {  'time'  :  '2017年'  ,  'url'  :  'https://www.mlit.go.jp/common/001380093.xlsx'  },
  {  'time'  :  '2018年'  ,  'url'  :  'https://www.mlit.go.jp/k-toukei/content/001448540.xlsx'  },
  {  'time'  :  '2019年'  ,  'url'  :  'https://www.mlit.go.jp/k-toukei/content/001448577.xlsx'  },
  {  'time'  :  '2020年'  ,  'url'  :  'https://www.mlit.go.jp/k-toukei/content/001448034.xlsx'  },
]

各年次の結果(DataFrame)をマージする関数を作成

def  get_merge_dataframe(params):
  df_res = pd.DataFrame(index=[], columns=['都道府県','港湾','種類'])
  
  for p in params:
    df = get_cargo(p['time'], p['url'])
    df_res = pd.merge(df_res, df, on=['都道府県','港湾','種類']  , how='outer')
    
return df_res

実行してみる。

df_cargo = get_merge_dataframe(params_cargo)
df_cargo

csvでダウンロードする場合は下記を実行。

from google.colab import files


df_cargo.to_csv('取扱貨物量の推移【総トン数】.csv', encoding="shift_jis")
files.download('取扱貨物量の推移【総トン数】.csv')

取扱貨物量(品目別)

輸出・輸入・移出・移入とも同じ構成のExcelになっているので、EXCELのインポートからDataFameの整形までは共通関数でOK

def get_excel(url):
  # ブックの指定
  input_file_name = url
  input_book = pd.ExcelFile(input_file_name)
  
  # 統計結果は2番目のシート、上から2行は無視
  input_sheet_name = input_book.sheet_names
  df = input_book.parse(input_sheet_name[1],skiprows = 2)

  return df

エクセルをDataFrameに変換する関数

def get_dataframe(time,url):
 
  # EXCELデータをインポート
  df = get_excel(url)
  
  # 都道府県と港湾で集計
  df = df.astype({'トン数': 'int'})
  df = df.groupby(['都道府県','港名','品種名']).agg({'トン数': 'sum'}).reset_index()

  df = df[df['港名'] != '合計']

  df = df.rename(columns={'トン数':time})
  
  return df

繰り返し処理してひとつのDataFrameに整形する関数

def get_merge_dataframe(params):
  df_res = pd.DataFrame(index=[], columns=['都道府県','港名','品種名'])
  
  for p in params:
    df = get_dataframe(p['time'], p['url'])
    df_res = pd.merge(df_res, df, on=['都道府県','港名','品種名'] , how='outer')

  return df_res

輸出

パラメータをセットして

params_export = [
    { 'time' : '2012年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448464.xlsx' },
    { 'time' : '2013年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448471.xlsx' },
    { 'time' : '2014年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448478.xlsx' },
    { 'time' : '2015年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448485.xlsx' },
    { 'time' : '2016年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448499.xlsx' },
    { 'time' : '2017年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448521.xlsx' },
    { 'time' : '2018年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448545.xlsx' },
    { 'time' : '2019年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448582.xlsx' },
    { 'time' : '2020年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448037.xlsx' },
]

実行

df_export = get_merge_dataframe(params_export)
df_export

輸入

パラメータをセットして

params_import = [
    { 'time' : '2012年' , 'url' : 'https://www.mlit.go.jp/common/001277672.xls' },
    { 'time' : '2013年' , 'url' : 'https://www.mlit.go.jp/common/001277688.xls' },
    { 'time' : '2014年' , 'url' : 'https://www.mlit.go.jp/common/001277703.xls' },
    { 'time' : '2015年' , 'url' : 'https://www.mlit.go.jp/common/001277717.xls' },
    { 'time' : '2016年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448500.xlsx' },
    { 'time' : '2017年' , 'url' : 'https://www.mlit.go.jp/common/001277753.xls' },
    { 'time' : '2018年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448546.xlsx' },
    { 'time' : '2019年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448583.xlsx' },
    { 'time' : '2020年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448038.xlsx' },
]

実行

df_import = get_merge_dataframe(params_import)
df_import

移出

パラメータをセットして

params_emigration = [
    { 'time' : '2012年' , 'url' : 'https://www.mlit.go.jp/common/001277673.xls' },
    { 'time' : '2013年' , 'url' : 'https://www.mlit.go.jp/common/001277689.xls' },
    { 'time' : '2014年' , 'url' : 'https://www.mlit.go.jp/common/001277704.xls' },
    { 'time' : '2015年' , 'url' : 'https://www.mlit.go.jp/common/001277718.xls' },
    { 'time' : '2016年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448501.xlsx' },
    { 'time' : '2017年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448522.xlsx' },
    { 'time' : '2018年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448547.xlsx' },
    { 'time' : '2019年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448584.xlsx' },
    { 'time' : '2020年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448039.xlsx' },
]

実行

df_emigration = get_merge_dataframe(params_emigration)
df_emigration

移入

パラメータをセットして

params_immigration = [
    { 'time' : '2012年' , 'url' : 'https://www.mlit.go.jp/common/001277674.xls' },
    { 'time' : '2013年' , 'url' : 'https://www.mlit.go.jp/common/001277690.xls' },
    { 'time' : '2014年' , 'url' : 'https://www.mlit.go.jp/common/001277705.xls' },
    { 'time' : '2015年' , 'url' : 'https://www.mlit.go.jp/common/001380154.xlsx' },
    { 'time' : '2016年' , 'url' : 'https://www.mlit.go.jp/common/001380116.xlsx' },
    { 'time' : '2017年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448523.xlsx' },
    { 'time' : '2018年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448548.xlsx' },
    { 'time' : '2019年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448585.xlsx' },
    { 'time' : '2020年' , 'url' : 'https://www.mlit.go.jp/k-toukei/content/001448040.xlsx' },
]

実行

df_immigration = get_merge_dataframe(params_immigration)
df_immigration

いいなと思ったら応援しよう!