pytimetkで時系列データの操作と可視化


pytimetkについて


pytimetkは、時系列データの操作と可視化のプロセスを簡素化するためのライブラリです。polarsをバックエンドとして活用することも出来るので、pandasよりも処理速度を大幅に改善することが可能です。処理速度の改善だけではなく、時系列データの操作がpandasよりも簡単に出来るようになっています。

インストール

pip install pytimetk

ライブラリの読み込み

import pytimetk as tk

データの可視化

plot_timeseries()

データの可視化をすることが出来ます。
まずはpytimetkに搭載されているデータセットを読み込みます。

taylor_30_min = tk.load_dataset("taylor_30_min", parse_dates = ['date'])
taylor_30_min

taylor_30_minは30分間隔のメガワット単位のエネルギー需要の時系列データです。

taylor_30_min

それでは、plot_timeseries()で可視化を行ってみます。
日付のカラム(date)と、時間によって変化する数値のカラム(value)を指定します。デフォルトではPlotlyを使ってプロットが行われますが、engineパラメーターをplotnineやmatplotlibに指定することで変更が可能です。

taylor_30_min.plot_timeseries('date', 'value')

データラングリング

summarize_by_time()

時系列データを集約します。

m4_daily_df = tk.load_dataset('m4_daily', parse_dates = ['date'])

print(m4_daily_df.head())
print('\nLength of the full dataset:', len(m4_daily_df))
m4_daily

m4_dailyは日単位のデータセットです。
週単位の予測を行いたい場合にsummarize_by_time()を使用して、週単位に集約することが出来ます。

summarized_df = m4_daily_df \
    .summarize_by_time(
        date_column = 'date',
        value_column = 'value',
        freq = 'W',
        agg_func = 'sum'
    )

print(summarized_df.head())
print('\nLength of the full dataset:', len(summarized_df))

future_frame()

既存のインデックス(時間)よりも将来の時系列データを拡張するために使用します。将来の予測をする際に必要になります。

先ほど週単位に集約したデータを使用します。

summarized_df \
    .sort_values(by = 'date', ascending = True) \
    .iloc[: -1] \
    .tail(1)
最後の週

最後の週は2016-05-01の週ですが、そこから次の8週分を拡張したい場合に、次のようにして拡張できます。

summarized_extended_df = summarized_df \
    .future_frame(
        date_column = 'date',
        length_out  = 8
    )

summarized_extended_df \
    .query('value.isna()')
8週分が拡張されている。

pad_by_time()

日付が欠損している行を追加するために使用できます。
下記のようにして日付が欠損しているデータを生成します。

import pandas as pd

dates = pd.to_datetime(["2021-01-01", "2021-04-01", "2021-10-01"])
value = range(len(dates))

df = pd.DataFrame({
    'date': dates,
    'value': range(len(dates))
})

df

このデータに対して、例えば月間で埋めたい場合は下記のようにすることで日付の欠損を埋めることが可能です。

4fdf \
    .pad_by_time(
        date_column = 'date',
        freq = 'MS'
    ) \
    .assign(value = lambda x: x['value'].fillna(0))

特徴量エンジニアリング

augment_lags()

ラグ特徴量を追加します。
サンプルのデータを生成します。

import numpy as np
import random

dates = pd.date_range(start = '2023-09-18', end = '2023-09-24')
values = [random.randint(10, 50) for _ in range(7)]

df = pd.DataFrame({
    'date': dates,
    'value': values
})

df
サンプルデータ

augment_lagsでラグ特徴量を追加します。

df \
    .augment_lags(
        date_column  = 'date',
        value_column = 'value',
        lags         = 3
    )
3日間のラグ特徴量が追加されている。

augment_leads()

リード特徴量を追加します。

df \
    .augment_leads(
        date_column  = 'date',
        value_column = 'value',
        leads        = 3
    )
3日間のリード特徴量が追加されている。

augment_rolling()

ローリング特徴量を追加します。

df \
    .augment_rolling(
        date_column  = 'date',
        value_column = 'value',
        window       = 3,
        window_func  = 'mean'
    )
windowsで指定した期間のローリング特徴量が生成されている。

augment_time_series_signature()

日付を入力として、日付と時刻に関する29個の特徴量を追加します。

df \
    .augment_timeseries_signature(
        date_column = 'date'
    ) \
    .head()
日付と時刻に関する特徴量が追加されている。

追加される特徴量のリストは下記リファレンスで確認出来ます。

augment_holiday_signature()

休日のフラグを追加します。
日付と国の名称を指定することで指定した国の休日のフラグを追加できるようですが、残念ながらまだ日本を指定することは出来ないようです。

df \
    .augment_holiday_signature(
        date_column  = 'date',
        country_name = 'UnitedStates'
    )

対応されている国の一覧は下記のAPIリファレンスで確認できます。

augment_fourier()

フーリエ変換を行います。

フーリエ変換は、データ内の隠れた周期性や循環パターンを検出するのに役立つため、時系列予測における特徴量エンジニアリングのテクニックとしてよく用いられるとのことです。

m4_dailyデータセットを使用しています。

  • periodsパラメータは、フーリエ級数の各ピーク間のタイムステップ数を指定します。デフォルトは1です。

  • max_orderパラメータは、計算するフーリエ級数の最大次数を指定します。デフォルトは1です。

fourier_df = (
    m4_daily_df
        .query("id == 'D10'")
        .augment_fourier(
            date_column='date',
            periods=[1, 7],
            max_order=1
        )
)
fourier_df.head()