データ分析
2025/02/12
與田 龍人

Dataikuでの時系列予測におけるPython処理の例

Dataiku_logo

本記事では、Dataikuを用いた時系列予測のプロセスにおいて、Python機能を活用してデータの準備および分割を行う方法を解説します。時系列データを適切に処理し、効果的な予測を行うためには、学習データとテストデータを適切に分割することが重要です。

はじめに

本記事では、Dataikuを用いた時系列予測のプロセスにおいて、Python機能を活用してデータの準備および分割を行う方法を解説します。時系列データを適切に処理し、効果的な予測を行うためには、学習データとテストデータを適切に分割することが重要です。

1. テストデータの生成

時系列予測では、将来のデータを事前に生成し、モデルがどのようなパターンを予測するかを検証することが重要です。Code recipesを開きpythonをクリックします。



Inputに加工したいデータ、Outputの加工後に出力するためのテーブルを用意します。



その後Pyhonのエディタが展開され、コードを入力することができます。以下のコードでは、既存のデータを基に未来の7日間のデータを生成します。コードの入力が完了したらRunボタンを教えて、処理を開始します。



import dataiku
import pandas as pd, numpy as np
from dataiku import pandasutils as pdu

# Read recipe inputs
historical_data = dataiku.Dataset("historical_data")
historical_data_df = historical_data.get_dataframe()

# 'data' 列を日付型に変換
historical_data_df['data'] = pd.to_datetime(historical_data_df['data'])

# 'data' でデータを昇順にソート
historical_data_df = historical_data_df.sort_values(by='data')

# 最新の日付を取得
latest_date = historical_data_df['data'].max()

# 未来のデータ日付範囲を生成(最新日付から次の日付以降の7日分)
test_data_dates = pd.date_range(start=latest_date + pd.Timedelta(days=1), periods=7)

# 未来データ用にカテゴリを取得
unique_categories = historical_data_df['category'].unique()

# 未来のデータフレームを作成
test_data = pd.DataFrame([(date, category) for date in test_data_dates for category in unique_categories],
columns=['data', 'category'])

# 未来データに元のデータのカラムを追加し、値を空にする
test_data = test_data.reindex(columns=historical_data_df.columns, fill_value=None)

# 元のデータと未来データを結合
combined_data = pd.concat([historical_data_df, test_data], ignore_index=True)

# 出力データセットに代入
generated_data_df = combined_data

# Write recipe outputs
generated_data = dataiku.Dataset("generated_data")
generated_data.write_with_schema(generated_data_df)


このコードでは、以下の処理を行っています。



  • データの読み込み:Dataikuのデータセットを取得

  • 日付の変換とソート:データを時系列順に並べる

  • 未来のデータ生成:最新日付から7日分の未来データを作成

  • カテゴリの適用:元のデータのカテゴリを未来データにも適用

  • データセットの保存:生成したデータをDataikuに書き込む


この処理により、予測モデルが学習するための適切なテストデータを準備できます。




2. データの分割

データを適切に学習・検証・テストの3つの期間に分割することで、モデルの評価精度を向上させます。1と同じようにPythonを開き、コードを実行していきます。以下のコードでは、学習期間を365日(1年)、検証期間を7日、テスト期間を7日と設定し、データを分割します。



import dataiku
import pandas as pd
from dataiku import pandasutils as pdu

# Dataikuのデータセットを読み込む
prepared_data = dataiku.Dataset("prepared_data")
df = prepared_data.get_dataframe()

# 'data' を日付型に変換
df['data'] = pd.to_datetime(df['data'])

# 年末年始の期間(12月23日~1月5日)を除外
df = df[~(
((df['data'].dt.month == 12) & (df['data'].dt.day >= 23)) |
((df['data'].dt.month == 1) & (df['data'].dt.day <= 5))
)]

# 'data' でデータを昇順にソート
df = df.sort_values(by='data')

# 各期間の日数を設定
test_period_days = 7 # テスト:最新1週間
validate_period_days = 7 # 検証:テスト直前の1週間
train_period_days = 365 # 学習:検証直前の1年間

# データセット内の最新の日付を取得
latest_date = df['data'].max()

# テストデータの抽出
test_data_start_date = latest_date - pd.Timedelta(days=test_period_days - 1)
test_data_end_date = latest_date
test_data = df[
(df['data'] >= test_data_start_date) &
(df['data'] <= test_data_end_date)
]

# 検証データの抽出
validate_data_end_date = test_data_start_date - pd.Timedelta(days=1)
validate_data_start_date = validate_data_end_date - pd.Timedelta(days=validate_period_days - 1)
validate_data = df[
(df['data'] >= validate_data_start_date) &
(df['data'] <= validate_data_end_date)
]

# 学習データの抽出
train_data_end_date = validate_data_start_date - pd.Timedelta(days=1)
train_data_start_date = train_data_end_date - pd.Timedelta(days=train_period_days - 1)
train_data = df[
(df['data'] >= train_data_start_date) &
(df['data'] <= train_data_end_date)
]

# Dataikuデータセットへの書き込み
train_dataset = dataiku.Dataset("train_dataset")
train_dataset.write_with_schema(train_data)

validate_dataset = dataiku.Dataset("validate_dataset")
validate_dataset.write_with_schema(validate_data)

test_dataset = dataiku.Dataset("test_dataset")
test_dataset.write_with_schema(test_data)


このコードでは、


1.データの取得と前処理


2.学習・検証・テストの3つの期間に分割


3.Dataikuのデータセットとして保存 を実行しています。



まとめ

本記事では、Dataikuでの時系列予測におけるPythonを活用したデータ処理について解説しました。学習期間1年、予測期間1週間という設定により、短期予測に適したデータセットを作成され今後の運用に適したフローとなりました。Dataikuのビジュアル機能とPythonを組み合わせることで、より柔軟なデータ処理と予測モデルの開発が可能になります。


New call-to-action