我正在尝试开发一些代码来预处理一些自动回归算法的数据。为了做到这一点,我将新的列添加到我用于学习过程的dataFrame(这些新列包含以前的输出值)。在经过相当多的努力之后,我正在使用以下代码:
for i in range(0, n):
tmpOutput = pd.Series(output.ix[i:len(output.index)-n+i, 1])
tmpOutput.index = range(n, len(output.index) + 1)
tmpOutput.name = 'T-' + str(n-i)
tmp = tmp.join([tmpOutput])
你可以看到我首先提取一些数据并从中构建一个系列;然后我修改索引并重命名系列(以避免在我的循环中出现一些命名冲突),最后,我执行连接。如果这个代码可以增强,如果有另一种方式,可以提高性能,我就会徘徊。
答案 0 :(得分:0)
您的代码的意图似乎是创建系列output
的n个滞后版本,虽然没有看到消耗它的代码(请显示它,或者至少是公式),但我们还是在黑暗中工作;我想你可以避免需要创建和存储同一系列的n个滞后副本。所以不要在第一时间创建这个矩阵!无论如何,即使你真的需要创建和附加,也不需要使用for循环迭代地执行它,这将非常慢。避免for循环,并避免在整个系列中包含join
的for循环。此外,无需手动创建索引。
对于延迟功能,请参阅pandas.DataFrame.shift()或pandas.Series.shift()或rolling
功能。
另见例如Andy Hayden's answer to "How to create a lagged data structure using pandas dataframe"
答案 1 :(得分:0)
通过smci实现提示,这是使用pandas concat和shift函数的解决方案:
import numpy as np
import pandas as pd
np.random.seed(1)
ts = pd.Series(np.random.rand(100))
max_lag = 5
column_names = ['T + %d'%lag for lag in range(max_lag+1)]
df = pd.concat([ts.shift(lag) for lag in range(max_lag+1)], keys = column_names, axis = 1)
df.head(10)
Out[5]:
T + 0 T + 1 T + 2 T + 3 T + 4 T + 5
0 0.417022 NaN NaN NaN NaN NaN
1 0.720324 0.417022 NaN NaN NaN NaN
2 0.000114 0.720324 0.417022 NaN NaN NaN
3 0.302333 0.000114 0.720324 0.417022 NaN NaN
4 0.146756 0.302333 0.000114 0.720324 0.417022 NaN
5 0.092339 0.146756 0.302333 0.000114 0.720324 0.417022
6 0.186260 0.092339 0.146756 0.302333 0.000114 0.720324
7 0.345561 0.186260 0.092339 0.146756 0.302333 0.000114
8 0.396767 0.345561 0.186260 0.092339 0.146756 0.302333
9 0.538817 0.396767 0.345561 0.186260 0.092339 0.146756