Python で時系列データをロードして探索する方法
Python の Pandas ライブラリは、時系列データに対する優れた組み込みサポートを提供します。
Pandas は、ロードされると、データセットを探索してより深く理解するためのツールも提供します。
この投稿では、時系列データセットを読み込んで探索する方法を説明します。
このチュートリアルを完了すると、次のことがわかります。
- Pandas を使用して CSV ファイルから時系列データセットをロードする方法。
- ロードされたデータを参照して要約統計を計算する方法。
- 時系列データをプロットして確認する方法。
私の新しい本『Time Series Forecasting With Python』 でプロジェクトをキックスタートします。これにはステップバイステップのチュートリアルとPython ソース コード ファイルが含まれています。すべての例。
始めましょう。
- 2019 年 4 月更新: データセットへのリンクを更新しました。
- 2019 年 8 月更新: 新しい API を使用するようにデータ読み込みを更新しました。
毎日の女性の出生データセット
この投稿では、例として毎日の女性の出生データセットを使用します。
この単変量時系列データセットは、1959 年のカリフォルニアにおける毎日の女性の出生数を記述します。
単位はカウントであり、観測値は 365 です。データセットの出典は Newton (1988) によるものとされています。
- データセットをダウンロードします。
以下は、ヘッダー行を含む最初の 5 行のデータのサンプルです。
"Date","Daily total female births in California, 1959"
"1959-01-01",35
"1959-01-02",32
"1959-01-03",30
"1959-01-04",31
"1959-01-05",44
以下はデータセット全体のプロットです。
データセットをダウンロードし、ファイル名「daily-total-girl-births-in-cal.csv」を付けて現在の作業ディレクトリに配置します。
- データセットをダウンロードします。
時系列データのロード
Pandas は、時系列データセットをシリーズとして表現しました。
シリーズは、各行に時間ラベルを持つ 1 次元配列です。
シリーズには名前があり、これはデータ列の列名です。
各行に日付が関連付けられていることがわかります。これは実際には列ではなく、値の時間インデックスです。インデックスとして、一度に複数の値が存在する可能性があり、値は時間全体にわたって均等または不等間隔に配置される場合があります。
Pandas に CSV データをロードするための主な関数は read_csv() 関数です。これを使用して、次のように時系列を DataFrame ではなく Series オブジェクトとしてロードできます。
# Load birth data using read_csv
from pandas import read_csv
series = read_csv('daily-total-female-births-in-cal.csv', header=0, parse_dates=[0], index_col=0, squeeze=True)
print(type(series))
print(series.head())
read_csv() 関数の引数に注意してください。
データがシリーズとしてロードされることを保証するために、いくつかのヒントが提供されます。
- header=0: 行 0 にヘッダー情報を指定する必要があります。
- parse_dates=[0]: 最初の列のデータには解析が必要な日付が含まれているというヒントを関数に与えます。この引数はリストを受け取るため、最初の列のインデックスである 1 つの要素のリストを指定します。
- index_col=0: 最初の列に時系列のインデックス情報が含まれていることを示唆します。
- squeeze=True: データ列が 1 つだけであること、およびデータフレームではなくシリーズに興味があることを示唆しています。
独自のデータに使用する必要があるもう 1 つの引数は、日時値を解析する関数を指定する date_parser です。この例では、日付形式が推測されており、これはほとんどの場合に機能します。そうでない少数のケースでは、独自の日付解析関数を指定し、date_parser 引数を使用します。
上記の例を実行すると、同じ出力が表示されますが、時系列が実際に Series オブジェクトとして読み込まれたことも確認されます。
<class 'pandas.core.series.Series'>
Date
1959-01-01 35
1959-01-02 32
1959-01-03 30
1959-01-04 31
1959-01-05 44
Name: Daily total female births in California, 1959, dtype: int64
多くの場合、時系列データの操作は、Series オブジェクトではなく DataFrame で実行する方が簡単です。
そのような状況では、次のように、ロードされたシリーズを DataFrame に簡単に変換できます。
dataframe = DataFrame(series)
さらに読む
- pandas.read_csv() 関数の詳細。
時系列データの探索
Pandas は、時系列データを探索して要約するためのツールも提供します。
このセクションでは、読み込まれた時系列データを調査して要約するためのいくつかの一般的な操作を見ていきます。
データを覗いてみる
ロードされたデータを覗いて、タイプ、日付、データが意図したとおりにロードされていることを確認することをお勧めします。
head() 関数を使用して、最初の 5 レコードを表示したり、確認する最初の n 個のレコードを指定したりできます。
たとえば、次のようにデータの最初の 10 行を印刷できます。
from pandas import read_csv
series = read_csv('daily-total-female-births-in-cal.csv', header=0, index_col=0)
print(series.head(10))
この例を実行すると、次が出力されます。
Date
1959-01-01 35
1959-01-02 32
1959-01-03 30
1959-01-04 31
1959-01-05 44
1959-01-06 29
1959-01-07 45
1959-01-08 43
1959-01-09 38
1959-01-10 27
tail() 関数を使用して、データセットの最後の n レコードを取得することもできます。
観測値の数
データに対して実行するもう 1 つの簡単なチェックは、読み込まれた観測値の数です。
これは、列ヘッダーが意図したとおりに処理されないという問題を解決し、後で教師あり学習アルゴリズムで使用するためにデータを効果的に分割する方法についてのアイデアを得るのに役立ちます。
サイズパラメータを使用してシリーズの次元を取得できます。
from pandas import read_csv
series = read_csv('daily-total-female-births-in-cal.csv', header=0, index_col=0)
print(series.size)
この例を実行すると、予想通り、1959 年の毎日に 1 つずつ、合計 365 の観測値があることがわかります。
365
時間によるクエリ
時間インデックスを使用して、シリーズをスライス、ダイス、クエリすることができます。
たとえば、次のようにして 1 月のすべての観測値にアクセスできます。
from pandas import read_csv
series = read_csv('daily-total-female-births-in-cal.csv', header=0, parse_dates=[0], index_col=0, squeeze=True)
print(series['1959-01'])
これを実行すると、1959 年 1 月の 31 件の観測値が表示されます。
Date
1959-01-01 35
1959-01-02 32
1959-01-03 30
1959-01-04 31
1959-01-05 44
1959-01-06 29
1959-01-07 45
1959-01-08 43
1959-01-09 38
1959-01-10 27
1959-01-11 38
1959-01-12 33
1959-01-13 55
1959-01-14 47
1959-01-15 45
1959-01-16 37
1959-01-17 50
1959-01-18 43
1959-01-19 41
1959-01-20 52
1959-01-21 34
1959-01-22 53
1959-01-23 39
1959-01-24 32
1959-01-25 37
1959-01-26 43
1959-01-27 39
1959-01-28 35
1959-01-29 44
1959-01-30 38
1959-01-31 24
このタイプのインデックスベースのクエリは、データセットの探索中に要約統計量やプロットを準備するのに役立ちます。
記述統計
時系列に関する記述統計を計算すると、値の分布と広がりを把握するのに役立ちます。
これは、データのスケーリングや、モデリング用のデータセットの準備の一環として後で実行できるデータ クリーニングのアイデアに役立つ場合があります。
describe() 関数は、観測値の平均、標準偏差、中央値、最小値、最大値を含む、読み込まれた時系列の 7 つの数値の概要を作成します。
from pandas import read_csv
series = read_csv('daily-total-female-births-in-cal.csv', header=0, index_col=0)
print(series.describe())
この例を実行すると、出生率データセットの概要が出力されます。
count 365.000000
mean 41.980822
std 7.348257
min 23.000000
25% 37.000000
50% 42.000000
75% 46.000000
max 73.000000
時系列のプロット
時系列データ、特に単変量時系列のプロットは、データを探索する上で重要な部分です。
この機能は、plot() 関数を呼び出すことで、ロードされたシリーズに提供されます。
以下は、読み込まれた時系列データセット全体をプロットする例です。
from pandas import read_csv
from matplotlib import pyplot
series = read_csv('daily-total-female-births-in-cal.csv', header=0, index_col=0)
pyplot.plot(series)
pyplot.show()
この例を実行すると、Y 軸に毎日の出生数、X 軸に日数を示す時系列プロットが作成されます。
さらに読む
時系列データを操作する Pandas の機能について詳しく知りたい場合は、以下のリンクを参照してください。
- Pandas の時系列/日付機能
- パンダ時系列の基本
- pandas を使用した時系列分析
まとめ
この投稿では、Pandas Python ライブラリを使用して時系列データを読み込み、処理する方法を発見しました。
具体的には、次のことを学びました。
- 時系列データを Pandas シリーズとしてロードする方法。
- 時系列データの概要統計を調べて計算する方法。
- 時系列データをプロットする方法。
Python での時系列データの処理、またはこの投稿についてご質問がありますか?
以下のコメント欄でご質問ください。できる限りお答えいたします。