首页 > 解决方案 > 如何为时间序列适当地迭代 Pandas Dataframe

问题描述

所以我知道你永远不会想迭代 Pandas DataFrame,但我找不到解决这个问题的另一种方法。

我有一堆不同的时间序列,比如说它们是日终股票价格。它们在这样的 DataFrame 中:

   Ticker Price
0   AAA    10
1   AAA    11
2   AAA    10.5
3   BBB    100
4   BBB    110
5   CCC    60
etc.

对于每个 Ticker,我想采用各种模型并在连续更大批量的数据上训练它们。具体来说,我想建立一个模型,在第 1 天的数据上对其进行训练,然后预测第 2 天。在第 1 天和第 2 天训练相同的模型,预测第 3 天等。对于每一天,我想切到前一天并预测该子集 [day0:dayN-1]。

本质上,我正在实现 sklearn 的TimeSeriesSplit,除了我自己做,因为我正在训练的模型不在 sklearn 中(例如,一个模型是Prophet)。

这个想法是我在一堆不同的 Tickers 上尝试一堆模型,然后我看看哪些模型适用于哪些 Tickers。

因此,我在所有数据上运行一个模型的基本代码如下所示:

import pandas as pd


def make_predictions(df):

    res = pd.DataFrame()

    for ticker in df.ticker.unique():
        df_ticker = df[df['ticker'] == ticker]

        for i,_ in df_ticker.iterrows():
            X = df_ticker[0:i]
            X = do_preparations(X)           # do some processing to prepare the data
            m = train_model(X)               # train the model
            forecast = make_predictions(m)   # predict one week

            df_ticker.loc[i,'preds'] = forecast['y'][0]

        res = pd.concat([res,df_ticker])

    return res

但是我的代码运行速度非常慢。我可以以某种方式加快速度吗?我不知道如何使用 .apply() 或任何其他常见的反迭代技术。

标签: pythonpandas

解决方案


考虑几个项目:

  • 首先,通过在循环内调用来避免二次复制。pd.concat相反,构建一个数据帧的列表/字典,一旦在循环外连接起来。
  • 其次,避免,DataFrame.iterrows因为你只使用i. 相反,遍历index.
  • 第三,为了紧凑,避免unique()使用后续的子集[...]。相反,groupby()在字典或列表理解中使用可能比list.append方法稍快,并且由于您的多个步骤,需要内部定义的函数。

内循环可能是不可避免的,因为您确实在运行不同的模型。

def make_predictions(df):

   def proc_model(sub_df):

      for i in sub_df.index:
         X = sub_df.loc[0:i]
         X = do_preparations(X)           # do some processing to prepare the data
         m = train_model(X)               # train the model
         forecast = make_predictions(m)   # predict one week

         sub_df.loc[i,'preds'] = forecast['y'][0]

      return sub_df   

   # BUILD DICTIONARY OF DATA FRAMES
   df_dict = {i:proc_model(g) for i, g in df.groupby('ticker')}

   # CONCATENATE DATA FRAMES
   res = pd.concat(df_dict, ignore_index=True)

   return res

推荐阅读