コンテンツにスキップ

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")
Back to top