python - 如何为时间序列适当地迭代 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() 或任何其他常见的反迭代技术。
解决方案
考虑几个项目:
- 首先,通过在循环内调用来避免二次复制。
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
推荐阅读
- javascript - 如何在 React / React Native 中使用 Emscripten 编译的 JavaScript
- node.js - 获取 Elastic BeanStalk 部署过程日志
- objective-c - MacOSX 上的 AVAudioRecorder 问题
- javascript - 如何按照描述创建矩阵
- excel - 电子表格 | 表格:在一个单元格中显示范围之间的数字
- java - 如何与活动进程/子进程通信?
- r - 如何将变量列表传递给函数,但还要考虑引用和引用
- android - 如何使用 adb 命令安装已卸载的应用程序
- jasper-reports - 从 json 有效负载动态设置 net.sf.jasperreports.export.xls.sheet.name
- html - 为什么下面的图像行是从上面移动的?