はじめに
時系列データは、一定の間隔で収集または記録されたデータポイントのシーケンスです。時系列データの分析は、予測、財務分析、およびさまざまなドメインのトレンドの理解に重要です。この記事では、PythonライブラリであるPandasを使用して、時系列データの処理と分析方法について紹介します。
日付と時間の扱い方
この章では、Pandasライブラリを使用してDateTimeオブジェクトを作成および操作する方法を示すために、例題データセットを使用します。また、日付と時間を文字列から解析し、必要に応じて書式を設定する方法も学びます。
以下は、例題データセットです。
data = {'Date': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],
'Value': [10, 20, 30, 40, 50]}
DateTimeオブジェクトの作成
最初に、必要なライブラリをインポートし、例題データセットをPandas DataFrameに読み込みます。
import pandas as pd
data = {'Date': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],
'Value': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
print(df)
Date Value
0 2021-01-01 10
1 2021-01-02 20
2 2021-01-03 30
3 2021-01-04 40
4 2021-01-05 50
次に、pd.to_datetime()
を使用して「Date」列を文字列からDateTimeオブジェクトに変換します。
df['Date'] = pd.to_datetime(df['Date'])
print(df)
Date Value
0 2021-01-01 10
1 2021-01-02 20
2 2021-01-03 30
3 2021-01-04 40
4 2021-01-05 50
日付と時間の書式設定
DateTimeオブジェクトをstrftime()
関数を使用してフォーマットすることができます。「Date」列を「Month-Day-Year」という書式にフォーマットしてみます。
df['Formatted_Date'] = df['Date'].dt.strftime('%m-%d-%Y')
print(df)
Date Value Formatted_Date
0 2021-01-01 10 01-01-2021
1 2021-01-02 20 01-02-2021
2 2021-01-03 30 01-03-2021
3 2021-01-04 40 01-04-2021
4 2021-01-05 50 01-05-2021
文字列から日付と時間の解析
新しい「Date_Str」列があると仮定し、日付が「Month-Day-Year」の形式で記載されており、DateTimeオブジェクトに変換したい場合を考えてみます。
data = {'Date_Str': ['01-01-2021', '01-02-2021', '01-03-2021', '01-04-2021', '01-05-2021'],
'Value': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
print(df)
Date_Str Value
0 01-01-2021 10
1 01-02-2021 20
2 01-03-2021 30
3 01-04-2021 40
4 01-05-2021 50
format
パラメータを使用して、「Date_Str」列を解析し、DateTimeオブジェクトに変換するには、pd.to_datetime()
関数を使用することができます。
df['Date'] = pd.to_datetime(df['Date_Str'], format='%m-%d-%Y')
print(df)
Date_Str Value Date
0 01-01-2021 10 2021-01-01
1 01-02-2021 20 2021-01-02
2 01-03-2021 30 2021-01-03
3 01-04-2021 40 2021-01-04
4 01-05-2021 50 2021-01-05
これで、「Date_Str」列から日付を解析してDateTimeオブジェクトの新しい「Date」列を作成することができました。
時系列リサンプリング
この章では、ダウンサンプリングとアップサンプリングを含む時系列リサンプリング技術を、例題データセットを使用して探索します。リサンプリングは、データポイントの頻度を変更するために時系列データを操作する必要がある場合に必要です。
以下は、例題データセットです。
import pandas as pd
date_rng = pd.date_range(start='2021-01-01', end='2021-01-10', freq='D')
data = {'Date': date_rng, 'Value': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]}
df = pd.DataFrame(data)
print(df)
Date Value
0 2021-01-01 10
1 2021-01-02 20
2 2021-01-03 30
3 2021-01-04 40
4 2021-01-05 50
5 2021-01-06 60
6 2021-01-07 70
7 2021-01-08 80
8 2021-01-09 90
9 2021-01-10 100
ダウンサンプリング
ダウンサンプリングは、データを低頻度に集約する処理です。「value」列の平均値を各期間の結果として3日ごとにダウンサンプリングしてみます。
まず、DataFrameの「Date」列をインデックスとして設定する必要があります。
df.set_index('Date', inplace=True)
print(df)
Value
Date
2021-01-01 10
2021-01-02 20
2021-01-03 30
2021-01-04 40
2021-01-05 50
2021-01-06 60
2021-01-07 70
2021-01-08 80
2021-01-09 90
2021-01-10 100
次に、ダウンサンプリングを行います。
downsampled_df = df.resample('3D').mean()
print(downsampled_df)
Value
Date
2021-01-01 20.000000
2021-01-04 46.666667
2021-01-07 73.333333
2021-01-10 100.000000
アップサンプリング
アップサンプリングは、データの頻度を増やす処理です。データセットを1時間ごとにアップサンプリングして、前方のデータ補間を行ってみます。
upsampled_df = df.resample('H').ffill()
print(upsampled_df.head(10))
Value
Date
2021-01-01 00:00:00 10
2021-01-01 01:00:00 10
2021-01-01 02:00:00 10
2021-01-01 03:00:00 10
2021-01-01 04:00:00 10
2021-01-01 05:00:00 10
2021-01-01 06:00:00 10
2021-01-01 07:00:00 10
2021-01-01 08:00:00 10
2021-01-01 09:00:00 10
2021-01-01 10:00:00 10
データが1時間ごとにアップサンプリングされ、前方のデータ補間が行われていることがわかります。
アップサンプリング時に欠損値を補完する場合、補間に線形補間を使用することもできます。データセットで線形補間を実行してみます。
upsampled_df_interpolated = df.resample('H').interpolate()
print(upsampled_df_interpolated.head(10))
Value
Date
2021-01-01 00:00:00 10.000000
2021-01-01 01:00:00 10.416667
2021-01-01 02:00:00 10.833333
2021-01-01 03:00:00 11.250000
2021-01-01 04:00:00 11.666667
2021-01-01 05:00:00 12.083333
2021-01-01 06:00:00 12.500000
2021-01-01 07:00:00 12.916667
2021-01-01 08:00:00 13.333333
2021-01-01 09:00:00 13.750000
移動窓関数
この章では、移動窓関数とその応用について、例題データセットを使用して探索します。移動窓関数は、時系列データを平滑化し、指定されたウィンドウサイズ内でさまざまな統計量を計算するのに役立ちます。
以下は、例題データセットです。
import pandas as pd
date_rng = pd.date_range(start='2021-01-01', end='2021-01-10', freq='D')
data = {'Date': date_rng, 'Value': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]}
df = pd.DataFrame(data)
print(df)
Date Value
0 2021-01-01 10
1 2021-01-02 20
2 2021-01-03 30
3 2021-01-04 40
4 2021-01-05 50
5 2021-01-06 60
6 2021-01-07 70
7 2021-01-08 80
8 2021-01-09 90
9 2021-01-10 100
基本的な移動窓操作
まずは、DataFrameの「Date」列をインデックスとして設定します。
df.set_index('Date', inplace=True)
print(df)
Value
Date
2021-01-01 10
2021-01-02 20
2021-01-03 30
2021-01-04 40
2021-01-05 50
2021-01-06 60
2021-01-07 70
2021-01-08 80
2021-01-09 90
2021-01-10 100
次に、ウィンドウサイズを3とした移動平均を計算してみます。
df['Rolling_Mean'] = df['Value'].rolling(window=3).mean()
print(df)
Value Rolling_Mean
Date
2021-01-01 10 NaN
2021-01-02 20 NaN
2021-01-03 30 20.000000
2021-01-04 40 30.000000
2021-01-05 50 40.000000
2021-01-06 60 50.000000
2021-01-07 70 60.000000
2021-01-08 80 70.000000
2021-01-09 90 80.000000
2021-01-10 100 90.000000
拡張ウィンドウ
拡張ウィンドウは、成長するウィンドウサイズで統計量を累積的に計算する方法です。例題データセットの累積和を拡張ウィンドウを使用して計算してみます。
df['Expanding_Sum'] = df['Value'].expanding().sum()
print(df)
Value Rolling_Mean Expanding_Sum
Date
2021-01-01 10 NaN 10.0
2021-01-02 20 NaN 30.0
2021-01-03 30 20.000000 60.0
2021-01-04 40 30.000000 100.0
2021-01-05 50 40.000000 150.0
2021-01-06 60 50.000000 210.0
2021-01-07 70 60.000000 280.0
2021-01-08 80 70.000000 360.0
2021-01-09 90 80.000000 450.0
2021-01-10 100 90.000000 550.0
カスタム移動窓関数
移動窓に対してカスタム関数を適用することもできます。例えば、ウィンドウサイズが3の範囲内で最大値と最小値の差を計算してみます。
def max_min_diff(series):
return series.max() - series.min()
df['Max_Min_Diff'] = df['Value'].rolling(window=3).apply(max_min_diff)
print(df)
Value Rolling_Mean Expanding_Sum Max_Min_Diff
Date
2021-01-01 10 NaN 10.0 NaN
2021-01-02 20 NaN 30.0 NaN
2021-01-03 30 20.000000 60.0 20.0
2021-01-04 40 30.000000 100.0 20.0
2021-01-05 50 40.000000 150.0 20.0
2021-01-06 60 50.000000 210.0 20.0
2021-01-07 70 60.000000 280.0 20.0
2021-01-08 80 70.000000 360.0 20.0
2021-01-09 90 80.000000 450.0 20.0
2021-01-10 100 90.000000 550.0 20.0