Pandasで時系列データを扱う基礎:DataFrameとSeriesの活用術 🗓️
データ分析において、時系列データは非常に重要です。株価、気温、売上データなど、時間の経過とともに変化するデータは多岐にわたります。Pandasは、時系列データを効率的に扱うための強力な機能を提供しており、特にDataFrame
とSeries
は時系列分析の中心となります。本記事では、Pandasを使って時系列データを処理する基本的な方法を、初心者の方にも分かりやすく解説します。
1. 時系列データとは? 🕰️
時系列データとは、時間順に並べられたデータポイントの集合のことです。各データポイントには、それが観測された特定の時点が関連付けられています。
時系列データの特徴
順序性: データは時間の経過とともに順序付けられています。
時間間隔: データポイント間の時間間隔は、一定(例: 毎日、毎月)の場合もあれば、不規則な場合もあります。
トレンド、季節性、周期性: 多くの時系列データには、長期的な傾向(トレンド)、特定の季節に繰り返されるパターン(季節性)、周期的な変動(周期性)が見られます。
2. Pandasでの時系列データ表現 📊
Pandasでは、主にDateTimeIndex
をインデックスとして持つSeries
やDataFrame
を用いて時系列データを扱います。
to_datetime()
で日付文字列を変換
Pandasで時系列データを扱う第一歩は、日付や時刻を表す文字列をdatetime
型に変換することです。pd.to_datetime()
関数がこの役割を担います。
import pandas as pd
# 日付文字列のリスト
date_strings = ['2024-01-01', '2024/01/02', 'Jan 3, 2024']
# datetime型に変換
dates = pd.to_datetime(date_strings)
print(dates)
実行結果:
DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03'], dtype='datetime64[ns]', freq=None)
さまざまな形式の日付文字列を自動で認識し、datetime64[ns]
型に変換してくれます。
H3: date_range()
で日付範囲を生成
連続した日付や時刻のインデックスが必要な場合は、pd.date_range()
関数が便利です。
import pandas as pd
# 2024年1月1日から10日間、毎日生成
daily_dates = pd.date_range(start='2024-01-01', periods=10, freq='D')
print("日次データ:\n", daily_dates)
# 2024年1月から3ヶ月間、月初に生成
monthly_dates = pd.date_range(start='2024-01-01', periods=3, freq='MS')
print("\n月次データ:\n", monthly_dates)
実行結果:
日次データ:
DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04',
'2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08',
'2024-01-09', '2024-01-10'],
dtype='datetime64[ns]', freq='D')
月次データ:
DatetimeIndex(['2024-01-01', '2024-02-01', '2024-03-01'], dtype='datetime64[ns]', freq='MS')
freq
引数で頻度を指定できます。'D'
は日次、'MS'
は月初を意味します。他にも様々な頻度コードがあります(例: 'H'
時間、'T'
分、'W'
週次など)。
時系列Series/DataFrameの作成
DateTimeIndex
をインデックスに設定することで、時系列Series
やDataFrame
を作成できます。
import pandas as pd
import numpy as np
# 日次データでSeriesを作成
dates = pd.date_range(start='2024-01-01', periods=5, freq='D')
temperatures = pd.Series(np.random.randint(10, 25, size=5), index=dates, name='Temperature')
print("時系列Series:\n", temperatures)
# 日次データでDataFrameを作成
data = {'Sales': np.random.randint(100, 200, size=5),
'Cost': np.random.randint(50, 100, size=5)}
df_time_series = pd.DataFrame(data, index=dates)
print("\n時系列DataFrame:\n", df_time_series)
実行結果:
時系列Series:
2024-01-01 24
2024-01-02 14
2024-01-03 21
2024-01-04 11
2024-01-05 12
Freq: D, Name: Temperature, dtype: int64
時系列DataFrame:
Sales Cost
2024-01-01 190 57
2024-01-02 129 76
2024-01-03 133 85
2024-01-04 118 54
2024-01-05 109 96
3. 時系列データの操作 ⚙️
時系列データは、日付や時刻を基準とした便利な操作が可能です。
H3: 時刻ベースの選択 (Indexing/Slicing)
DateTimeIndex
を持つデータフレームは、日付や時刻を指定してデータを簡単に選択できます。
import pandas as pd
import numpy as np
# サンプルDataFrame
dates = pd.date_range(start='2024-01-01', periods=10, freq='D')
data = {'Value': np.random.randint(100, 200, size=10)}
df = pd.DataFrame(data, index=dates)
print("元のDataFrame:\n", df)
# 特定の日のデータを取得
print("\n2024-01-05のデータ:\n", df.loc['2024-01-05'])
# 日付範囲でデータをスライス
print("\n2024-01-03から2024-01-07のデータ:\n", df['2024-01-03':'2024-01-07'])
# 年月でデータをスライス
print("\n2024年1月のデータ:\n", df['2024-01'])
実行結果:
元のDataFrame:
Value
2024-01-01 150
2024-01-02 155
2024-01-03 190
2024-01-04 101
2024-01-05 144
2024-01-06 105
2024-01-07 194
2024-01-08 169
2024-01-09 134
2024-01-10 102
2024-01-05のデータ:
Value 144
Name: 2024-01-05 00:00:00, dtype: int64
2024-01-03から2024-01-07のデータ:
Value
2024-01-03 190
2024-01-04 101
2024-01-05 144
2024-01-06 105
2024-01-07 194
2024年1月のデータ:
Value
2024-01-01 150
2024-01-02 155
2024-01-03 190
2024-01-04 101
2024-01-05 144
2024-01-06 105
2024-01-07 194
2024-01-08 169
2024-01-09 134
2024-01-10 102
日付や年月を指定するだけで、直感的にデータを抽出できます。
リサンプリング (Resampling)
リサンプリングは、時系列データの頻度を変更する操作です。例えば、日次データを週次や月次に集計したり、逆に短い頻度に変換したりできます。
ダウンサンプリング: 高い頻度から低い頻度へ(例: 日次 → 月次)
アップサンプリング: 低い頻度から高い頻度へ(例: 月次 → 日次、通常は補間が必要)
import pandas as pd
import numpy as np
# サンプルDataFrame (日次データ)
dates = pd.date_range(start='2024-01-01', periods=30, freq='D')
data = {'Sales': np.random.randint(100, 500, size=30)}
df = pd.DataFrame(data, index=dates)
print("日次データ (先頭5行):\n", df.head())
# 週次で合計を計算 (ダウンサンプリング)
weekly_sales = df['Sales'].resample('W').sum()
print("\n週次合計売上:\n", weekly_sales)
# 月次で平均を計算 (ダウンサンプリング)
monthly_avg_sales = df['Sales'].resample('M').mean()
print("\n月次平均売上:\n", monthly_avg_sales)
実行結果:
日次データ (先頭5行):
Sales
2024-01-01 449
2024-01-02 271
2024-01-03 203
2024-01-04 129
2024-01-05 409
週次合計売上:
Date
2024-01-07 2018
2024-01-14 2054
2024-01-21 2313
2024-01-28 2226
2024-02-04 747
Freq: W-SUN, Name: Sales, dtype: int64
月次平均売上:
Date
2024-01-31 283.7
Freq: M, Name: Sales, dtype: float64
resample()
メソッドの後には、sum()
, mean()
, min()
, max()
などの集計関数を続けて呼び出します。
4. まとめ ✨
PandasのDataFrame
とSeries
は、時系列データを扱う上で非常に強力なツールです。
pd.to_datetime()
で文字列をdatetime
型に変換する。pd.date_range()
で連続した日付インデックスを生成する。DateTimeIndex
を持つSeries
やDataFrame
を作成し、時系列データとして処理する。時刻ベースのインデックスやスライスでデータを簡単に選択する。
resample()
を使ってデータの頻度を変更し、集計する。
これらの機能を使いこなすことで、時系列データの準備から分析までを効率的に行うことができます。ぜひ、ご自身の時系列データでこれらの操作を試してみてください!