Pythonで時系列分析の練習(4)Pandasで時系列データの作成とグラフ描画

Pythonで時系列分析の練習(4)Pandasで時系列データの作成とグラフ描画

Pythonで時系列分析する手法をモモノキ&ナノネと一緒に学習していきます。

モモノキ&ナノネと一緒にPythonで時系列分析を覚えよう(4)





Pandasで時系列データの作成とグラフ描画

時系列分析の続きを始めるね。今回もPandasの使い方を練習するよ。ナノネ、またPandasだけインポートしておいて。

Pandasの準備OK。

In [1]:
import pandas as pd

日付型の値の作り方を以前に少しだけ練習したけど、日付を一度にたくさん生成する方法も覚えよう。Pandasのdate_rangeを使うと効率よく日付が作れるよ。

連続した日付を作りたい場合は.pd.date_range(開始日[時], freq='D', periods=個数)だよ。

今日の日付から5日分作ってみた。

In [2]:
date_index=pd.date_range('2018-02-24', freq='D', periods=5) # 周期に日を指定
date_index
Out[2]:
DatetimeIndex(['2018-02-24', '2018-02-25', '2018-02-26', '2018-02-27',
               '2018-02-28'],
              dtype='datetime64[ns]', freq='D')
In [3]:
my_df = pd.DataFrame([10,20,30,40,50],
                     index=date_index,
                     columns=['val'])
my_df
Out[3]:
val
2018-02-24 10
2018-02-25 20
2018-02-26 30
2018-02-27 40
2018-02-28 50

月毎に作りたい場合は.freqに'M'か'MS'を指定すればできるよ。'M'は月末で'MS'だと月初になるよ。

In [4]:
date_index=pd.date_range('2018-02-24', freq='M', periods=5) # 周期に月(末)を指定
date_index

my_df = pd.DataFrame([10,20,30,40,50],
                     index=date_index,
                     columns=['val'])
my_df
Out[4]:
val
2018-02-28 10
2018-03-31 20
2018-04-30 30
2018-05-31 40
2018-06-30 50
In [5]:
date_index=pd.date_range('2018-02-24', freq='MS', periods=5) # 周期に月(初)を指定
date_index

my_df = pd.DataFrame([10,20,30,40,50],
                     index=date_index,
                     columns=['val'])
my_df
Out[5]:
val
2018-03-01 10
2018-04-01 20
2018-05-01 30
2018-06-01 40
2018-07-01 50

週間隔で作るには'W'?

'W'でOKだよ。あと、特定の開始曜日も指定できるよ。金曜日を指定したい場合は、freqに'W-FRI'と指定してね。

簡単にできた。便利かも。

In [6]:
date_index=pd.date_range('2018-01-01', freq='W-FRI', periods=5) # 周期に週(金曜始まり)を指定
date_index

my_df = pd.DataFrame([10,20,30,40,50],
                     index=date_index,
                     columns=['val'])
my_df
Out[6]:
val
2018-01-05 10
2018-01-12 20
2018-01-19 30
2018-01-26 40
2018-02-02 50

年毎を作ろうとして、freqに'Y'を指定したらエラーで怒られた。

In [7]:
# date_index=pd.date_range('2018-01-01', freq='Y', periods=5)
# -> ValueError: Invalid frequency: Y

年毎は'A'を指定してね。'A'なら年末、'AS'で年初になるよ。

In [8]:
date_index=pd.date_range('2018-01-01', freq='AS', periods=5) # 周期に週(金曜始まり)を指定
date_index

my_df = pd.DataFrame([10,20,30,40,50],
                     index=date_index,
                     columns=['val'])
my_df
Out[8]:
val
2018-01-01 10
2019-01-01 20
2020-01-01 30
2021-01-01 40
2022-01-01 50

ややこしいなぁ。。。

便利な機能で、Pandasに格納したデータから簡単にグラフが描けるよ。 ナノネ、日付と値を入れたデータを適当に1年分作ってみて。

In [9]:
import numpy as np
n = 365
date_index=pd.date_range('2018-01-01', freq='D', periods=365) # 日付1年分 
values = np.cumsum(np.random.randn(n)) # 正規乱数365個、足し合わせ
my_df = pd.DataFrame({'val': values}, index=date_index)
my_df.head()
Out[9]:
val
2018-01-01 0.362938
2018-01-02 0.339590
2018-01-03 1.420053
2018-01-04 1.548340
2018-01-05 3.197320

モモノキ、データ作ったけでこれでいい?日付は今年1年分、値はNumpyを使って乱数で。

データはそれで十分だよ。ナノネ、Numpyいつのまに覚えたの?

グーグル先生に聞いてみた。

なるほど。グラフ作成はDataFrame(またはSeries)変数名のあとに.plot()とすればOKだよ。インデックスに日付、列データが1つ以上あれば時系列グラフを自動で作成してくるよ。
それと、グラフはMatplotlibの機能を利用して描画されるのでインライン表示用のマジックコマンドも忘れずに。

In [10]:
%matplotlib inline
my_df.plot()
Out[10]:
<matplotlib.axes._subplots.AxesSubplot at 0xad2e7e0c>

なんかいい感じ?のグラフがでてきた。

グラフ種類は他にも沢山あるよ。データ内容に応じて活用できそうなものを調べてみてね。

最後にデータのダウンサンプリングを学習しておこう。日次データを週単位、月単位などに集約することができるよ。サンプルサイズを変更するには、resample(周期指定文字)を使えばOKだよ。利用する場合は値の集約方法もあとに続けて指定する必要があるよ。

たとば月毎で集約、値に平均値(mean)を適用するときは、DataFrame変数名.resample('M').mean()とすれば、ダウンサンプリングができるよ。

In [11]:
my_df_down = my_df.resample('M').mean() # 月(末)単位、値は平均化
my_df_down
Out[11]:
val
2018-01-31 -2.051387
2018-02-28 -13.065086
2018-03-31 -15.560685
2018-04-30 -22.879307
2018-05-31 -18.653355
2018-06-30 -13.964929
2018-07-31 -12.403967
2018-08-31 -13.112236
2018-09-30 -15.756182
2018-10-31 -18.604285
2018-11-30 -17.955855
2018-12-31 -20.306924

うまくいったみたい。日次データが月次データに変更できた。

ナノネ、さっき覚えたグラフの作成方法で、ダウンサンプリングしたデータもプロットしてみて。

plot()でOK。

In [12]:
my_df_down.plot() # ダウンサンプリングした月次データ
Out[12]:
<matplotlib.axes._subplots.AxesSubplot at 0xabccefcc>

参考までに2つのデータを同じグラフにプロットしてみたよ。(月次の方のデータが月初?でプロットされちゃったけど、気にしないことにするね)

In [13]:
my_df_down = my_df_down.rename(columns={'val': 'val_month'}) # 列名(ラベル)変更
In [14]:
axis = my_df.plot() # 日次
my_df_down.plot(ax=axis) # 月次
Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0xabd1308c>

次回は飛行機乗客数のデータを使って、時系列分析の練習を進めていくよ。

飛行機、ラジャー。





スポンサーリンク

0 件のコメント :

コメントを投稿