Python:Excelファイルからの読み込み

Excelファイルがたくさんあるとき、それを次々に読み込んで1つのDataFrameに集約します。

東京消防庁にある熱中症搬送者数データは、都道府県別・症状別・年齢別・発症場所別など、データはとても充実しています。
夏だけのデータですが、年度ごとにファイルが分かれていて、月ごとにシートが分かれています。
https://www.fdma.go.jp/disaster/heatstroke/post4.html

東京消防庁の熱中症搬送データをダウンロードできるサイト

さらに、年によって収録されている月の数、つまりシートの枚数がことなります。最大は5月から9月までに5枚

2008年のデータは3ヶ月分

このデータは都道府県別にデイリィ。都道府県は、コードで記載されています。
このデータから東京のデータを抜き出し、東京の1ヶ月分の合計搬送者数を求めます。

ファイル名は以下のとおり

ファイル名一覧
  1. ファイル名をリストにしておく

  2. 各ファイルについて以下の処理を行う

    1. ファイルをシート1枚ずつ読み込む(最大5枚)

    2. シートが不足してエラーになったらBreak

    3. DataFrameに追加する

  3. 東京都だけ抜き出す

  4. 年月ごとに合計を求める

  5. CSVファイルに出力する

(1)ファイル名のリスト
有難い事にファイル名が規則的でしたので、プログラムでリストを作成することができました。

filename  = []
for i in range(20 , 31) :
    s = 'heatstroke003_data_h'+str(i)+'.xlsx'
    filename.append(s)
for i in range(1 , 5) :
    s = 'heatstroke003_data_r'+str(i)+'.xlsx'
    filename.append(s)

(2)Excelから読み込むには、ファイル名とシート名(またはシート番号)を指定します。

data = pd.read_excel('/content/'+name , sheet_name=[0])

ただし、nameにはファイル名が保存されているものとする。
シート番号は0から始まる連番(マクロVBAでは1からですが、Pythonは0発進)で指定することができます。
sheet_name = [0 , 1, 2 , 3, 4 ]
のように指定できますが、ここでは、ファイルによって枚数が異なるので、1枚ずつ読み込むことにします。
1枚ずつ5回読み込みますが、シートの枚数はファイルによって異なり、足りないファイルではエラーになります。エラーになったら、終了します。
「エラーになったら」の部分をtry〜except構文を利用します

    for i in range(5) :
        try :
            print(i)
            data = pd.read_excel('/content/'+name , sheet_name=[i])

        except  :
            #print('error')
            break

ファイルを読み込んだdataは辞書になります
キーはシート番号
値は、DataFrameです
辞書の要素は1個しかない(1シートずつ読み込むため)けれど、キーが毎回ことなるので、for文でキーと値を取り出します。
値はDataFrame型なので、これをdfに次々に追加していきます
以上を関数にしておき、引数としてdfとファイル名を受け取って、新しいdf を返します

def one_file(name , df) :
    print(name)
    for i in range(5) :
        try :
            print(i)
            data = pd.read_excel('/content/'+name , sheet_name=[i])
            #print('input OK')
            for j , one in data.items() :
                df = pd.concat([df , one])
        except  :
            #print('error')
            break
    return df

(3)全体処理
ファイル名リストから1つずつ取り出して、関数を呼び出します

df = pd.DataFrame()
for one in filename :
    df = one_file(one , df)

これで全部のデータがdfに読み込まれました。

(4)東京だけとりだす
東京の都道府県番号は13なので、

df13 = df[df['都道府県コード'] == 13]

(5)月ごとの合計を求める
groupbyを利用しますが、年月日から年と月だけを取り出して、1ヶ月分が同じになるようにします。

year_month = df13['日付'].dt.strftime('%Y-%m')

year_monthはシリーズです

※ df['年月'] =  df13['日付'].dt.strftime('%Y-%m')
のようにいきなりdfの列としようとするとエラーが発生する

求めた「年月」と搬送者数だけで構成された新たなDataFrameを形成しようと思います。(余計な列がたくさんあるので)

df1 = pd.concat([year_month , df13['搬送人員(計)'] ] , axis=1)
df1.head()
年月と搬送者数
df_day = df1.groupby('日付').sum()

同じ日付を集めて、合計を出します

月ごとの合計搬送者数

(6)ファイル保存

df_day.to_csv('東京都熱中症搬送者数day.csv')

該当する月のアイスクリームの消費金額との関係を求めてみた

擬似相関の例

アイスを食べたら、搬送者数が増えるか、と言ったら、そんなことはないですね
これは、平均気温が間に介在しています。このような因果関係に見えることを擬似相関といいます