当前位置: 首页 > 面试题库 >

如何使用Pandas DataFrame创建滞后数据结构

鲜于温书
2023-03-14
问题内容

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

问题答案:

如前所述,值得研究一下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

这样做比清单上的工作效率更高…



 类似资料:
  • 如果每个事件间隔为1秒,并且有2秒的滞后,那么我希望示例输入和输出如下所示。 输入:1,2,3,4,5,6,7... 输出:NA,NA,1,2,3,4,5...

  • 问题内容: 问题: 是否可以在迁移脚本中创建一个新的数据库,然后连接到它?怎么样? 我的场景: 我正在尝试在Java项目(使用Jersey2.4 + tomcat 7 + PostgreSQL 9.3.1 + EclipseLink的RESTful应用程序)中使用flyway来管理使用git的不同开发人员之间的更改。我写了自己的初始化脚本,并运行了: 而且效果很好。问题是我无法使用脚本创建新的数据

  • 我刚刚开始学习阿帕奇骆驼。我了解路线和组件的基本知识。现在,我想尝试连接到Oracle数据库,从一个特定表中读取记录,并使用组件将这些记录写入文件。为了从数据库中读取数据,我假设需要使用JDBC组件,并给出数据源名称。 但是,我找不到有关如何使用camel创建数据源的任何信息。我找到的与此主题相关的所有信息都使用了Spring DSL示例。我不使用Spring,我只需要使用简单的独立Java应用程

  • 问题内容: 读完Hibernate之后:hbm2ddl.auto=正在生产中更新吗?出现了一些问题。首先,我使用Hibernate的原因是要与数据库供应商无关(无需编写10个版本的“相同” sql查询,例如tsql vs. sql)。 我的问题是在创建数据库架构(生产环境)时出现的。据我所知,我有两种选择。 hbm2dll =更新 纯sql(ddl)脚本。 在上面的主题中广泛讨论了第一种选择。第二

  • 我正在尝试构建一个包含节点的队列数据结构,每个节点都有整数值和一个指向下一个节点的指针,他有问题 deQueue(队列 q);函数,它返回像堆栈(LIFO)这样的元素,这是我的代码和输出 取消排队(); enQueue(): main():

  • 问题内容: 使用SQLAlchemy,将创建一个Engine对象,如下所示: 如果to参数(在这种情况下为)中指定的数据库不存在,则访问将失败。如果指定的数据库不存在,是否可以告诉SQLAlchemy创建一个新数据库? 问题答案: 在postgres上,通常默认情况下存在三个数据库。如果您能够以超级用户身份(例如,角色)进行连接,则可以连接到或数据库。默认的pg_hba.conf只允许名为unix