import numpy as np
import pandas as pd

"""
Explanation: データハンドリング
この章で扱うもの

千葉市の過去3年間の気象データ
千葉市の過去3年間のインフルエンザ発見件数のデータ
上記のデータを組合せて、この次の章で使用する可視化や機械学習で使用しやすいデータにする

気象データ
気象データは気象庁のWebサイトから様々なデータが取得可能です。
今回は、過去3年間の千葉市をターゲットにしているので、必要な項目を選択しCSVで入手します。
インフルエンザ発見件数
千葉市のオープンデータに、「インフルエンザの週毎の定点当たり報告数」というものがあり、それを用いる
この章で取り扱う手順

データの入手(2箇所から、CSVデータ)
データの概要確認
データの結合
データの加工
欠損値処理

必要なライブラリのインポート
End of explanation
"""


df_weather = pd.read_csv("data/気象庁千葉.csv", encoding='shift_jis')

"""
Explanation: データの入手・概要を確認・加工
気象データ
気象庁の過去の気象データ
http://www.data.jma.go.jp/gmd/risk/obsdl/index.php
End of explanation
"""


df_weather.head()

"""
Explanation: pandas の read_csv関数で、CSVデータを読込。読み込みの際に文字エンコーディングを指定している
End of explanation
"""


df_weather.shape

"""
Explanation: headメソッドで、データの先頭を確認。うまく取り込みているようです。
End of explanation
"""


f = open("data/気象庁千葉.csv", encoding="shift_jis")
for l in f.readlines()[:10]:
    print(l)

"""
Explanation: データの行と列の数を確認。なぜか、1列になっています。
End of explanation
"""


df_weather = pd.read_csv("data/気象庁千葉.csv", encoding='shift_jis', skiprows=3)

"""
Explanation: 元のCSVをテキストファイルとして読み込んで表示してみます。
行と列の情報以外に１行目にデータ以外の情報が入っていました。
End of explanation
"""


df_weather.shape

"""
Explanation: 気象データのCSVを再度読み込みます。今回は、３行目まで読み込み無視するように宣言しました。
End of explanation
"""


df_weather.head()

df_weather.tail()

"""
Explanation: 問題なく取り込めているようです。
End of explanation
"""


df_weather.iloc[1, :]

df_weather.iloc[1, :].notnull()

[i for i, t in enumerate(df_weather.iloc[1, :].isnull()) if t]

df_weather_temp = df_weather.iloc[:, [i for i, t in enumerate(df_weather.iloc[1, :].isnull()) if t]]

"""
Explanation: .head()メソッドと.tail()メソッドを使い、データの概要を見てみました。データとしては良さそうです。
End of explanation
"""


df_weather = df_weather[df_weather.columns[df_weather.iloc[1].isnull()]]

df_weather.head()

df_weather.tail()

df_weather.shape

df_weather = df_weather.drop([0, 1])

df_weather['年月日'] = pd.to_datetime(df_weather["年月日"])

df_weather = df_weather.set_index('年月日')

df_weather.head()

df_weather.tail()

df_weather.dtypes

df_weather.to_pickle("df_weather.db")

"""
Explanation: ここではリスト内包表記でカラムの位置を取得していますが以下でも同じ動作になります。(pandasの機能を用いた方法)
End of explanation
"""


!ls data/

df_2014 = pd.read_csv("data/201412influenza.csv", encoding="shift_jis")

df_2014.head()

df_2014 = pd.DataFrame(df_2014.iloc[1, 1:])

df_2014.columns = ['報告数']

df_2014.head()

df_2014.tail()

date_index = pd.date_range(start="2013-12-30", periods=52, freq="W-MON")

date_index

df_2014.index = date_index

df_2014.head()

df_2014.tail()

df_2015 = pd.read_csv("data/201512influenza.csv", encoding="shift_jis")

df_2015 = pd.DataFrame(df_2015.iloc[1, 1:])
df_2015.columns = ["報告数"]
date_index_2015 = pd.date_range(start="2014-12-29", periods=53, freq="W-MON")
df_2015.index =date_index_2015
df_2015.head()

df_2015.tail()

df_2016 = pd.read_csv("data/201612influenza.csv", encoding='shift_jis')

df_2016 = pd.DataFrame(df_2016.iloc[1, 1:])
df_2016.columns = ["報告数"]
date_index_2016 = pd.date_range(start="2016-1-4", periods=53, freq="W-MON")
df_2016.index =date_index_2016
df_2016.head()

df_2016.tail()

"""
Explanation: 千葉市のインフルエンザの状況
千葉県のオープンデータ
http://www.city.chiba.jp/opendata/index.php

インフルエンザの週毎の定点当たり報告数
ライセンス: CC-BY
2014年、2015年、2016年
End of explanation
"""


df_weather.head()

df_2014.head()

df_2015.head()

df_2016.head()

"""
Explanation: 取り込めたデータを再確認
いずれも、千葉市の

df_weather:  ２０１４年１月２０１７年４月までの気象データフレーム
ser_2014:  ２０１４年１月から２０１４年１２月までのインフルエンザの報告件数シリーズ
ser_2015:  ２０１5年１月から２０１5年１２月までのインフルエンザの報告件数データ
ser_2016:  ２０１6年１月から２０１6年１２月までのインフルエンザの報告件数データ
End of explanation
"""


df_influ = pd.concat([df_2014, df_2015, df_2016])

df_influ.shape

df_influ.head()

df_influ.tail()

df_influ = df_influ.dropna()

df_influ.shape

df_infｌu = pd.DataFrame(df_influ.astype(np.float32))

df_influ.head()

df_influ.dtypes

df_influ.to_pickle("df_influ.db")

"""
Explanation: データの結合と欠損値の処理
上記のデータを一つのデータフレームにまとめていきます。
必要に応じて欠損値も処理していきます。
インフルエンザの報告件数を3年分まとめる
End of explanation
"""


df = pd.concat([df_influ, df_weather], axis=1)

df.shape

df.head()

df.tail(40)

"""
Explanation: 気象データとつなげる
End of explanation
"""


df = df.loc["2014-01-01":"2016-12-31", :]

df.shape

df.head(10)

df.tail()

df["報告数"] = df["報告数"].fillna(method='ffill').astype(np.float32)

df.head(10)

df.tail(10)

"""
Explanation: 欠損値の処理
End of explanation
"""


