Python 如何适当地迭代时间序列的数据帧

Python 如何适当地迭代时间序列的数据帧,python,pandas,Python,Pandas,所以我知道你永远不会迭代熊猫数据帧,但我找不到解决这个问题的其他方法 我有一系列不同的时间序列,比如说它们是一天结束时的股价。它们位于这样的数据帧中: Ticker Price 0 AAA 10 1 AAA 11 2 AAA 10.5 3 BBB 100 4 BBB 110 5 CCC 60 etc. 对于每个股票代码,我想采用各种模型,并对它们进行连续更大批量的数据培训。具体来说,我想建立一个模型,根据第1天的数据进行训练,预

所以我知道你永远不会迭代熊猫数据帧,但我找不到解决这个问题的其他方法

我有一系列不同的时间序列,比如说它们是一天结束时的股价。它们位于这样的数据帧中:

   Ticker Price
0   AAA    10
1   AAA    11
2   AAA    10.5
3   BBB    100
4   BBB    110
5   CCC    60
etc.
对于每个股票代码,我想采用各种模型,并对它们进行连续更大批量的数据培训。具体来说,我想建立一个模型,根据第1天的数据进行训练,预测第2天。在第1天和第2天训练同一个模型,预测第3天,等等。对于每一天,我想切片到前一天,并预测该子集[day0:dayN-1]

基本上我是在实现sklearn的,除了我自己在做之外,因为我正在训练的模型不在sklearn中(例如,有一个模型是)

我的想法是在一堆不同的股票上尝试一堆模型,然后我看到哪些模型适合于哪些股票

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

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()或任何其他常见的反迭代技术。

考虑以下几项:

  • 首先,通过在循环内调用
    pd.concat
    来避免。相反,构建一个数据帧列表/目录,在循环外部连接一次
  • 其次,避免使用
    DataFrame.iterrows
    ,因为您只使用
    i
    。而是遍历
    索引
  • 第三,为了紧凑性,避免使用后续子集
    […]
    使用
    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

考虑几个项目:

  • 首先,通过在循环内调用
    pd.concat
    来避免。相反,构建一个数据帧列表/目录,在循环外部连接一次
  • 其次,避免使用
    DataFrame.iterrows
    ,因为您只使用
    i
    。而是遍历
    索引
  • 第三,为了紧凑性,避免使用后续子集
    […]
    使用
    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

欢迎来到SO!你的加速选择在某种程度上取决于你的功能。例如,
do_preparencies()
是否可以提前应用于整个数据帧?您的模型是否允许迭代添加数据,而不是每次都重新计算整个过程?首先,
.iterrrows()
是出了名的缓慢,重复附加和连接数据帧也是如此。我同意@ASGM,我想我们需要更多的信息。嗯,我可能会把
do_preparencies()
移到外循环。不幸的是,它删除了阻止我在适当的数据上循环的股票代码数据。至于重新计算模型,我以这种方式构建它,以防止将来的数据泄漏到任何给定的训练运行中。除了
.iterrows()
之外,还有其他可能更快的函数吗?除了附加和连接之外,是否还有其他方法可以适当地构建数据帧?这两种方法都很有吸引力。谢谢你的帮助!在不知道对这些行做了什么的情况下给出建议仍然是相当困难的。编写时很难知道代码在做什么:例如,
df_bdot
没有定义。您可以重新编写
do_preparencies()
,这样它就不会删除股票代码数据了吗?您是否一般了解如何编写数组相关(即应用兼容)函数?您是否考虑过
groupby()
?对不起,应该是“df_ticker”。我编辑了代码以反映它。欢迎使用SO!你的加速选择在某种程度上取决于你的功能。例如,
do_preparencies()
是否可以提前应用于整个数据帧?您的模型是否允许迭代添加数据,而不是每次都重新计算整个过程?首先,
.iterrrows()
是出了名的缓慢,重复附加和连接数据帧也是如此。我同意@ASGM,我想我们需要更多的信息。嗯,我可能会把
do_preparencies()
移到外循环。不幸的是,它删除了阻止我在适当的数据上循环的股票代码数据。至于重新计算模型,我以这种方式构建它,以防止将来的数据泄漏到任何给定的训练运行中。除了
.iterrows()
之外,还有其他可能更快的函数吗?除了附加和连接之外,是否还有其他方法可以适当地构建数据帧?这两种方法都很有吸引力。谢谢你的帮助!在不知道对这些行做了什么的情况下给出建议仍然是相当困难的。编写时很难知道代码在做什么:例如,
df_bdot
没有定义。您可以重新编写
do_preparencies()
,这样它就不会删除股票代码数据了吗?您是否一般了解如何编写数组相关(即应用兼容)函数?您是否考虑过
groupby()
?对不起,应该是“df_ticker”。我编辑了代码以反映它。