気象データは気象庁のWebサイトから様々なデータが取得可能です。 今回は、過去3年間の千葉市をターゲットにしているので、必要な項目を選択しCSVで入手します。
千葉市のオープンデータに、「インフルエンザの週毎の定点当たり報告数」というものがあり、それを用いる
In [1]:
import numpy as np
import pandas as pd
気象庁の過去の気象データ http://www.data.jma.go.jp/gmd/risk/obsdl/index.php
In [2]:
df_weather = pd.read_csv("data/気象庁千葉.csv", encoding='shift_jis')
pandas の read_csv関数で、CSVデータを読込。読み込みの際に文字エンコーディングを指定している
In [3]:
df_weather.head()
Out[3]:
headメソッドで、データの先頭を確認。うまく取り込みているようです。
In [4]:
df_weather.shape
Out[4]:
データの行と列の数を確認。なぜか、1列になっています。
In [5]:
f = open("data/気象庁千葉.csv", encoding="shift_jis")
for l in f.readlines()[:10]:
print(l)
元のCSVをテキストファイルとして読み込んで表示してみます。 行と列の情報以外に1行目にデータ以外の情報が入っていました。
In [6]:
df_weather = pd.read_csv("data/気象庁千葉.csv", encoding='shift_jis', skiprows=3)
気象データのCSVを再度読み込みます。今回は、3行目まで読み込み無視するように宣言しました。
In [7]:
df_weather.shape
Out[7]:
問題なく取り込めているようです。
In [8]:
df_weather.head()
Out[8]:
In [9]:
df_weather.tail()
Out[9]:
.head()メソッドと.tail()メソッドを使い、データの概要を見てみました。データとしては良さそうです。
In [10]:
df_weather.iloc[1, :]
Out[10]:
In [11]:
df_weather.iloc[1, :].notnull()
Out[11]:
In [12]:
[i for i, t in enumerate(df_weather.iloc[1, :].isnull()) if t]
Out[12]:
In [13]:
df_weather_temp = df_weather.iloc[:, [i for i, t in enumerate(df_weather.iloc[1, :].isnull()) if t]]
ここではリスト内包表記でカラムの位置を取得していますが以下でも同じ動作になります。(pandasの機能を用いた方法)
In [14]:
df_weather = df_weather[df_weather.columns[df_weather.iloc[1].isnull()]]
In [15]:
df_weather.head()
Out[15]:
In [16]:
df_weather.tail()
Out[16]:
In [17]:
df_weather.shape
Out[17]:
In [18]:
df_weather = df_weather.drop([0, 1])
In [19]:
df_weather['年月日'] = pd.to_datetime(df_weather["年月日"])
In [20]:
df_weather = df_weather.set_index('年月日')
In [21]:
df_weather.head()
Out[21]:
In [22]:
df_weather.tail()
Out[22]:
In [23]:
df_weather.dtypes
Out[23]:
In [24]:
df_weather.to_pickle("df_weather.db")
千葉県のオープンデータ http://www.city.chiba.jp/opendata/index.php
In [25]:
!ls data/
In [26]:
df_2014 = pd.read_csv("data/201412influenza.csv", encoding="shift_jis")
In [27]:
df_2014.head()
Out[27]:
In [28]:
df_2014 = pd.DataFrame(df_2014.iloc[1, 1:])
In [29]:
df_2014.columns = ['報告数']
In [30]:
df_2014.head()
Out[30]:
In [31]:
df_2014.tail()
Out[31]:
In [32]:
date_index = pd.date_range(start="2013-12-30", periods=52, freq="W-MON")
In [33]:
date_index
Out[33]:
In [34]:
df_2014.index = date_index
In [35]:
df_2014.head()
Out[35]:
In [36]:
df_2014.tail()
Out[36]:
In [37]:
df_2015 = pd.read_csv("data/201512influenza.csv", encoding="shift_jis")
In [38]:
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()
Out[38]:
In [39]:
df_2015.tail()
Out[39]:
In [40]:
df_2016 = pd.read_csv("data/201612influenza.csv", encoding='shift_jis')
In [41]:
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()
Out[41]:
In [42]:
df_2016.tail()
Out[42]:
In [43]:
df_weather.head()
Out[43]:
In [44]:
df_2014.head()
Out[44]:
In [45]:
df_2015.head()
Out[45]:
In [46]:
df_2016.head()
Out[46]:
In [47]:
df_influ = pd.concat([df_2014, df_2015, df_2016])
In [48]:
df_influ.shape
Out[48]:
In [49]:
df_influ.head()
Out[49]:
In [50]:
df_influ.tail()
Out[50]:
In [51]:
df_influ = df_influ.dropna()
In [52]:
df_influ.shape
Out[52]:
In [53]:
df_influ = pd.DataFrame(df_influ.astype(np.float32))
In [54]:
df_influ.head()
Out[54]:
In [55]:
df_influ.dtypes
Out[55]:
In [56]:
df_influ.to_pickle("df_influ.db")
In [57]:
df = pd.concat([df_influ, df_weather], axis=1)
In [58]:
df.shape
Out[58]:
In [59]:
df.head()
Out[59]:
In [60]:
df.tail(40)
Out[60]:
In [61]:
df = df.loc["2014-01-01":"2016-12-31", :]
In [62]:
df.shape
Out[62]:
In [63]:
df.head(10)
Out[63]:
In [64]:
df.tail()
Out[64]:
In [65]:
df["報告数"] = df["報告数"].fillna(method='ffill').astype(np.float32)
In [66]:
df.head(10)
Out[66]:
In [67]:
df.tail(10)
Out[67]:
In [ ]:
In [ ]: