Traffine I/O

日本語

2022-11-17

Pandasと時系列データ

はじめに

時系列データは、一定の間隔で収集または記録されたデータポイントのシーケンスです。時系列データの分析は、予測、財務分析、およびさまざまなドメインのトレンドの理解に重要です。この記事では、PythonライブラリであるPandasを使用して、時系列データの処理と分析方法について紹介します。

日付と時間の扱い方

この章では、Pandasライブラリを使用してDateTimeオブジェクトを作成および操作する方法を示すために、例題データセットを使用します。また、日付と時間を文字列から解析し、必要に応じて書式を設定する方法も学びます。

以下は、例題データセットです。

python
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に読み込みます。

python
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オブジェクトに変換します。

python
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」という書式にフォーマットしてみます。

python
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オブジェクトに変換したい場合を考えてみます。

python
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()関数を使用することができます。

python
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」列を作成することができました。

時系列リサンプリング

この章では、ダウンサンプリングとアップサンプリングを含む時系列リサンプリング技術を、例題データセットを使用して探索します。リサンプリングは、データポイントの頻度を変更するために時系列データを操作する必要がある場合に必要です。

以下は、例題データセットです。

python
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」列をインデックスとして設定する必要があります。

python
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

次に、ダウンサンプリングを行います。

python
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時間ごとにアップサンプリングして、前方のデータ補間を行ってみます。

python
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

移動窓関数

この章では、移動窓関数とその応用について、例題データセットを使用して探索します。移動窓関数は、時系列データを平滑化し、指定されたウィンドウサイズ内でさまざまな統計量を計算するのに役立ちます。

以下は、例題データセットです。

python
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」列をインデックスとして設定します。

python
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とした移動平均を計算してみます。

python
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

拡張ウィンドウ

拡張ウィンドウは、成長するウィンドウサイズで統計量を累積的に計算する方法です。例題データセットの累積和を拡張ウィンドウを使用して計算してみます。

python
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

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!