例
s=pd.Series([5,4,3,2,1], index=[1,2,3,4,5]) print s 1 5 2 4 3 3 4 2 5 1
有没有一种有效的方法来创建一个系列.例如,在每一行中包含滞后值(在此示例中最多滞后2)
3 [3, 4, 5] 4 [2, 3, 4] 5 [1, 2, 3]
这相当于s = pd.Series([[3,4,5],[2,3,4],[1,2,3]],index = [3,4,5])
对于具有很长时间序列的数据帧,如何以高效的方式完成这项工作?
谢谢
看到答案后编辑
好的,最后我实现了这个功能:
def buildLaggedFeatures(s,lag=2,dropna=True): ''' Builds a new DataFrame to facilitate regressing over all possible lagged features ''' if type(s) is pd.DataFrame: new_dict={} for col_name in s: new_dict[col_name]=s[col_name] # create lagged Series for l in range(1,lag+1): new_dict['%s_lag%d' %(col_name,l)]=s[col_name].shift(l) res=pd.DataFrame(new_dict,index=s.index) elif type(s) is pd.Series: the_range=range(lag+1) res=pd.concat([s.shift(i) for i in the_range],axis=1) res.columns=['lag_%d' %i for i in the_range] else: print 'Only works for DataFrame or Series' return None if dropna: return res.dropna() else: return res
它生成所需的输出并管理生成的DataFrame中列的命名.
对于系列作为输入:
s=pd.Series([5,4,3,2,1], index=[1,2,3,4,5]) res=buildLaggedFeatures(s,lag=2,dropna=False) lag_0 lag_1 lag_2 1 5 NaN NaN 2 4 5 NaN 3 3 4 5 4 2 3 4 5 1 2 3
并作为输入的DataFrame:
s2=s=pd.DataFrame({'a':[5,4,3,2,1], 'b':[50,40,30,20,10]},index=[1,2,3,4,5]) res2=buildLaggedFeatures(s2,lag=2,dropna=True) a a_lag1 a_lag2 b b_lag1 b_lag2 3 3 4 5 30 40 50 4 2 3 4 20 30 40 5 1 2 3 10 20 30
Andy Hayden.. 46
如上所述,值得研究一下rolling_函数,这意味着你将无法获得尽可能多的副本.
一个解决方案是CONCAT 转移系列在一起,使数据帧:
In [11]: pd.concat([s, s.shift(), s.shift(2)], axis=1) Out[11]: 0 1 2 1 5 NaN NaN 2 4 5 NaN 3 3 4 5 4 2 3 4 5 1 2 3 In [12]: pd.concat([s, s.shift(), s.shift(2)], axis=1).dropna() Out[12]: 0 1 2 3 3 4 5 4 2 3 4 5 1 2 3
在这方面的工作将比列表更有效...
如上所述,值得研究一下rolling_函数,这意味着你将无法获得尽可能多的副本.
一个解决方案是CONCAT 转移系列在一起,使数据帧:
In [11]: pd.concat([s, s.shift(), s.shift(2)], axis=1) Out[11]: 0 1 2 1 5 NaN NaN 2 4 5 NaN 3 3 4 5 4 2 3 4 5 1 2 3 In [12]: pd.concat([s, s.shift(), s.shift(2)], axis=1).dropna() Out[12]: 0 1 2 3 3 4 5 4 2 3 4 5 1 2 3
在这方面的工作将比列表更有效...
使用pandas DataFrame的非常简单的解决方案:
number_lags = 3 df = pd.DataFrame(data={'vals':[5,4,3,2,1]}) for lag in xrange(1, number_lags + 1): df['lag_' + str(lag)] = df.vals.shift(lag) #if you want numpy arrays with no null values: df.dropna().values for numpy arrays