如何使用pandas数据帧创建滞后数据结构

 香柏林茶业 发布于 2023-02-12 16:11

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

在这方面的工作将比列表更有效...

2 个回答
  • 如上所述,值得研究一下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
    

    在这方面的工作将比列表更有效...

    2023-02-12 16:12 回答
  • 使用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
    

    2023-02-12 16:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有