Time Series Basic
時間フィルタリング
def filter_time(input_df: pd.DataFrame,
year,
start_month,end_month,
start_date,end_date):
"""Get selected time duration DataFrame
Args:
df (pd.DataFrame): Original df
year (int) : data_year
start_month (int): start_month
end_month (int): end_month
start_date (int): start_date
end_date (int): end_date
Returns:
output_df(pd.DataFrame): Filtered_DataFrame
"""
input_df.index=pd.to_datetime(input_df.index)
start_datetime = datetime(year,start_month,start_date)
end_datetime = datetime(year, end_month,end_date)
output_df = input_df[(input_df.index > start_datetime)&(input_df.index < end_datetime)]
return output_df
# detailed filtering function of df
def detailed_filter_time(input_df:pd.DataFrame,
year,
start_month,end_month,
start_date,end_date,
start_hour,end_hour,
start_min,end_min):
"""Get selected time duration DataFrame
Args:
df (pd.DataFrame): Original df
year (int) : data_year
start_month (int): start_month
end_month (int): end_month
start_date (int): start_date
end_date (int): end_date
start_hour (int): start_hour
end_hour (int): end_hour
start_min (int): start_min
end_min (int): end_min
Returns:
output_df(pd.DataFrame): Detailed_Filtered_DataFrame
"""
df=input_df.copy()
start_datetime = datetime(year,start_month,start_date,start_hour,start_min)
end_datetime = datetime(year, end_month,end_date,end_hour,end_min)
output_df = df[(df.index > start_datetime)&(df.index < end_datetime)]
return output_df
スケール化した時系列トレンドの確認
def minmax_scaling(input_df: pd.DataFrame, target_cols: list):
"""Get Sacaled DataFrame
Args:
input_df (pd.DataFrame): Original df
target_cols (list): scaling target columns
Returns:
output_df(pd.DataFrame): scaled_DataFrame
"""
output_df=input_df.copy()
features = output_df[target_cols]
scaler = preprocessing.MinMaxScaler().fit(features.values)
features = scaler.transform(features.values)
output_df[target_cols] = features
return output_df
def plot_scaled_trend(input_df,tags:list,Normalize=True,font_size=2):
"""Get Scaled Data Trend
Args:
input_df (pd.DataFrame): Original df
tags (list): target column name
"""
sns.set(style="white",font_scale=font_size)
# Relation driver power vs ambient temp
fig, axes = plt.subplots(1, 1, figsize=(20, 8), sharey=True)
fig.suptitle('Scaled Trend')
if Normalize:
# Scaling
df_scaled=minmax_scaling(input_df=input_df,target_cols=tags)
for tag in tags:
sns.lineplot(df_scaled.index,df_scaled[tag],label=str(tag),linewidth=2)
plt.ylabel("Scaled Sensor Values")
plt.xlabel("Date")
plt.legend(loc="lower left")
else:
df_scaled=input_df.copy()
for tag in tags:
sns.lineplot(df_scaled.index,df_scaled[tag],label=str(tag),linewidth=2)
plt.ylabel("Sensor Values")
plt.xlabel("Date")
plt.legend(loc="lower left")
fig.tight_layout(pad=3, w_pad=3, h_pad=5.0)
文字列の日時データへの変換
# -*- coding: utf-8 -*-
# ライブラリをロード
import numpy as np
import pandas as pd
# 文字列を作成
date_strings = np.array(['03-04-2005 11:35 PM',
'23-05-2010 12:01 AM',
'04-09-2009 09:09 PM'])
# 日時データに変換
[pd.to_datetime(date, format='%d-%m-%Y %I:%M %p') for date in date_strings]
##########
# 日時データに変換
[pd.to_datetime(date, format="%d-%m-%Y %I:%M %p", errors="coerce")
for date in date_strings]
タイムゾーンの取り扱い
# -*- coding: utf-8 -*-
# ライブラリをロード
import pandas as pd
# 日時データを作成
pd.Timestamp('2017-05-01 06:00:00', tz='Europe/London')
##########
# 日時データを作成
date = pd.Timestamp('2017-05-01 06:00:00')
# タイムゾーンを設定
date_in_london = date.tz_localize('Europe/London')
# 日時データを表示
date_in_london
##########
# タイムゾーンを変更
date_in_london.tz_convert('Africa/Abidjan')
##########
# 日時データを3つ作成
dates = pd.Series(pd.date_range('2/2/2002', periods=3, freq='M'))
# タイムゾーンを設定
dates.dt.tz_localize('Africa/Abidjan')
##########
# ライブラリをロード
from pytz import all_timezones
# タイムゾーンを2つ表示
all_timezones[0:2]
日付と時間による選択
# -*- coding: utf-8 -*-
# ライブラリをロード
import pandas as pd
# データフレームを作成
dataframe = pd.DataFrame()
# 日時データを作成
dataframe['date'] = pd.date_range('1/1/2001', periods=100000, freq='H')
# 2つの日時の間の観測値を選択
dataframe[(dataframe['date'] > '2002-1-1 01:00:00') &
(dataframe['date'] <= '2002-1-1 04:00:00')]
##########
# インデックスとして指定
dataframe = dataframe.set_index(dataframe['date'])
# 2つの日時の間の観測値を選択
dataframe.loc['2002-1-1 01:00:00':'2002-1-1 04:00:00']
日付データを複数の特徴量に分解
# -*- coding: utf-8 -*-
# ライブラリをロード
import pandas as pd
# データフレームを作成
dataframe = pd.DataFrame()
# 150の日時データを作る
dataframe['date'] = pd.date_range('1/1/2001', periods=150, freq='W')
# 年、月、日、時、分を特徴量として作成
dataframe['year'] = dataframe['date'].dt.year
dataframe['month'] = dataframe['date'].dt.month
dataframe['day'] = dataframe['date'].dt.day
dataframe['hour'] = dataframe['date'].dt.hour
dataframe['minute'] = dataframe['date'].dt.minute
# 3行表示
dataframe.head(3)
日付の差の算出
# -*- coding: utf-8 -*-
# ライブラリをロード
import pandas as pd
# 日時データを作成
dates = pd.Series(pd.date_range("2/2/2002", periods=3, freq="M"))
# 曜日を表示
dates.dt.weekday_name
##########
# 曜日を表示
dates.dt.weekday
曜日の算出
# -*- coding: utf-8 -*-
# ライブラリをロード
import pandas as pd
# 日時データを作成
dates = pd.Series(pd.date_range("2/2/2002", periods=3, freq="M"))
# 曜日を表示
dates.dt.weekday_name
##########
# 曜日を表示
dates.dt.weekday
時間遅れ特徴量の作成
# -*- coding: utf-8 -*-
# ライブラリをロード
import pandas as pd
# データフレームを作成
dataframe = pd.DataFrame()
# 日付データを作成
dataframe["dates"] = pd.date_range("1/1/2001", periods=5, freq="D")
dataframe["stock_price"] = [1.1,2.2,3.3,4.4,5.5]
# 1行分ラグのある(遅れている)値を作成
dataframe["previous_days_stock_price"] = dataframe["stock_price"].shift(1)
# データフレームを表示
dataframe
移動時間窓の利用
# -*- coding: utf-8 -*-
# ライブラリをロード
import pandas as pd
# 日時データを作成
time_index = pd.date_range("01/01/2010", periods=5, freq="M")
# データフレームを作成し、インデックスを設定
dataframe = pd.DataFrame(index=time_index)
# 特徴量を作成
dataframe["Stock_Price"] = [1,2,3,4,5]
# 移動平均を計算
dataframe.rolling(window=2).mean()
時系列データの中の欠損値の取り扱い
# -*- coding: utf-8 -*-
# ライブラリをロード
import pandas as pd
import numpy as np
# 日時データを作成
time_index = pd.date_range("01/01/2010", periods=5, freq="M")
# データフレームを作成し、インデックスを設定
dataframe = pd.DataFrame(index=time_index)
# 欠損値を含む特徴量を作成
dataframe["Sales"] = [1.0,2.0,np.nan,np.nan,5.0]
# 欠損値を内挿して補完
dataframe.interpolate()
##########
# 前方補完
dataframe.ffill()
##########
# 後方補完
dataframe.bfill()
##########
# 欠損値を内挿
dataframe.interpolate(method="quadratic")
##########
# 欠損値を内挿
dataframe.interpolate(limit=1, limit_direction="forward")