Pythonで時系列分析の練習(2)データ処理に便利なPandasの使い方

Pythonで時系列分析の練習(2)データ処理に便利なPandasの使い方

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

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





データ処理に便利なPandasの使い方

時系列分析の続きを始めるね。今回はPandasのキホン的な操作を覚えよう。
ナノネ、前回までのコードを呼び出して実行してみて。

OK、実行したよ。

In [1]:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
plt.xkcd()
Out[1]:
<matplotlib.rc_context at 0xb4a90acc>

最初はPandasで時系列データを作成する練習をしよう。普通は事前に準備したCSVデータなどをPandasで読み込んで使うケースが多いけど、基礎練習なので一からデータを作ってみよう。

まず、日付を3つ作ってみよう。
datetimeモジュールは日付や時刻の値を利用するのに必要だから先にインポートしてね。日付はdatetimeモジュールのdateクラスで任意の日付が作れるよ。

作った日付をリスト型変数(my_date)に入れて、こんな感じでいい?

In [2]:
import datetime
my_date = [datetime.date(2018, 2, 15),
           datetime.date(2018, 2, 16),
           datetime.date(2018, 2, 17)]
print(my_date)
[datetime.date(2018, 2, 15), datetime.date(2018, 2, 16), datetime.date(2018, 2, 17)]

OK。datetimeモジュールは日付時刻を便利に扱える機能が他にも沢山あるので、必要になったときに公式ドキュメントなどを都度調べてみてね。

Python公式ドキュメント datetime(外部サイト)
https://docs.python.jp/3/library/datetime.html

3つの日付に対応する適当なデータを、リスト型で一つで作っておこう。値の型はflot型にしておいてね。あとで時系列分析用のライブラリを利用するとき、int型の値では使えないケースがあるからね。データをflot型にしておくことは重要だよ。

float型の適当な値で、データ用のリストを一つ作った。

In [3]:
my1_values = [10.0, 25.2, 30.3]
print(my1_values)
[10.0, 25.2, 30.3]

日付とデータを一つ準備できたので、Pandasに格納してみよう。データが1種類のときは、PandasのSeriesが利用できるよ。あと、Pandasのindexは日付(時刻)の値を指定してね。時系列データを扱うときに重要だよ。

Seriesの作成は、パラメーターにさっき作ったデータとindex=日付を指定して、こんな感じかな?

In [4]:
series1 = pd.Series(my1_values, index=my_date)

うん。作ったSeriesの中身を確認してみよう。

In [5]:
print(series1)
2018-02-15    10.0
2018-02-16    25.2
2018-02-17    30.3
dtype: float64

左側からインデックスの日付、次に設定したデータで型もfloat型。ちゃんと入っているね。

今後この学習で利用予定の飛行機乗客数時系列データは、データが1種類(乗客数)なのでSeariesが使えれば十分だけど、せっかくなので2種類以上のデータを作る方法も覚えておこう。

Seriesを二つ作るの??

Pandasでデータを作る方法はいろいろあるけど、データを2種類以上扱うときは、PandasのDataFrameを利用するよ。

ナノネ、追加でデータ用の適当なリストをもう一つ作ってみて。

OK。追加でもう一つデータ(my2_values)を作ったよ。

In [6]:
my2_values = [100.0, 200.0, 300.0]
print(my2_values)
[100.0, 200.0, 300.0]

データが2種類準備できたので、PandasのDataFrameに格納してみよう。今度はデータ列につける名前も指定してね。設定する方法は複数あるけど、今回はデータをキー(列名を入れいる)と値の辞書型で渡してみてね。

DataFrameを使って、データはキーに列の名前を指定。indexはSeriesのときと同じで日付を設定して。こんな感じかな?

In [7]:
my_df = pd.DataFrame({'Aモモノキ': my1_values,
                      'Bナノネ': my2_values},
                     index=my_date)

OK、作ったDataFrameの中身を確認してみよう。DataFrameを格納した変数名をタイプして実行すれば表にして確認できるよ。

In [8]:
my_df
Out[8]:
Aモモノキ Bナノネ
2018-02-15 10.0 100.0
2018-02-16 25.2 200.0
2018-02-17 30.3 300.0

列名を指定すれば、該当するデータだけ表示もできるよ。

In [9]:
my_df['Aモモノキ']
Out[9]:
2018-02-15    10.0
2018-02-16    25.2
2018-02-17    30.3
Name: Aモモノキ, dtype: float64

データが1種類だと表にしてくれないの?

指定方法にもよるけど、データが1種類のSeriesとして扱われると表は出ないよ。表にしたい場合は、列名をも配列で指定してね。データフレーム名[[列名]]みたいに。複数の列を指定するときも同様でデータフレーム名[[列名1, 列名2, ...]]だよ。

In [10]:
my_df[['Aモモノキ']]
Out[10]:
Aモモノキ
2018-02-15 10.0
2018-02-16 25.2
2018-02-17 30.3
In [11]:
my_df[['Aモモノキ', 'Bナノネ']] # 全2種類なのでmy_dfと同じ
Out[11]:
Aモモノキ Bナノネ
2018-02-15 10.0 100.0
2018-02-16 25.2 200.0
2018-02-17 30.3 300.0

データフレーム名.describe()と実行すれば、格納されたデータの統計量が確認できるよ。

In [12]:
my_df.describe()
Out[12]:
Aモモノキ Bナノネ
count 3.000000 3.0
mean 21.833333 200.0
std 10.560461 100.0
min 10.000000 100.0
25% 17.600000 150.0
50% 25.200000 200.0
75% 27.750000 250.0
max 30.300000 300.0

データ列を追加したり、削除したいときはどうすればいいの?

列の追加・削除も複数の方法があるので一例だけ試してみてね。
・列追加はデータフレーム名['追加する列名'] = 値リストで設定できるよ。
・列削除はデータフレーム名['削除する列名'].drop(列名, axis=1)が使えるよ。

In [13]:
my_df['Cウメノキ'] = [0.1, 0.2, 0.3] # 列データを1個追加
my_df['Dカキノキ'] = [1.0, 1.0, 1.0] # 列データを1個追加
my_df
Out[13]:
Aモモノキ Bナノネ Cウメノキ Dカキノキ
2018-02-15 10.0 100.0 0.1 1.0
2018-02-16 25.2 200.0 0.2 1.0
2018-02-17 30.3 300.0 0.3 1.0
In [14]:
# 元データから削除したい場合は変数に再代入が必要。
my_df = my_df.drop('Cウメノキ', axis=1) # axis=1で列方向削除を指定する
my_df
Out[14]:
Aモモノキ Bナノネ Dカキノキ
2018-02-15 10.0 100.0 1.0
2018-02-16 25.2 200.0 1.0
2018-02-17 30.3 300.0 1.0

列の追加と削除ができたよ。

単純な列削除なら、これでもOKだよ。

In [15]:
del my_df['Dカキノキ']
my_df
Out[15]:
Aモモノキ Bナノネ
2018-02-15 10.0 100.0
2018-02-16 25.2 200.0
2018-02-17 30.3 300.0

モモノキ、次の練習は?

続きは次回で、PandasでCSVファイルを使う練習をするよ。

時系列分析の学習まで、なかなか先に進まないけど大丈夫?

対話式でつくるのは、慣れないと結構時間がかかる。。。
気長に進めるけど、許してね。

ラジャー。





スポンサーリンク

0 件のコメント :

コメントを投稿