提高迭代连接代码的性能,从而创建DataFrame系列的滞后版本

时间:2016-12-12 09:41:09

标签: python performance pandas dataframe lag

我正在尝试开发一些代码来预处理一些自动回归算法的数据。为了做到这一点,我将新的列添加到我用于学习过程的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])

你可以看到我首先提取一些数据并从中构建一个系列;然后我修改索引并重命名系列(以避免在我的循环中出现一些命名冲突),最后,我执行连接。如果这个代码可以增强,如果有另一种方式,可以提高性能,我就会徘徊。

2 个答案:

答案 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"

python: shift column in pandas dataframe up by one

答案 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