熊猫滚动使用多列

Suthiro:

我正在尝试pandas.DataFrame.rolling.apply()在多个列上使用滚动功能。Python版本是3.7,pandas是1.0.2。

import pandas as pd

#function to calculate
def masscenter(x):
    print(x); # for debug purposes
    return 0;

#simple DF creation routine
df = pd.DataFrame( [['02:59:47.000282', 87.60, 739],
                    ['03:00:01.042391', 87.51, 10],
                    ['03:00:01.630182', 87.51, 10],
                    ['03:00:01.635150', 88.00, 792],
                    ['03:00:01.914104', 88.00, 10]], 
                   columns=['stamp', 'price','nQty'])
df['stamp'] = pd.to_datetime(df2['stamp'], format='%H:%M:%S.%f')
df.set_index('stamp', inplace=True, drop=True)

'stamp'是单调且唯一的,'price'是double且不包含NaN,'nQty'是整数,也不包含NaN。

因此,我需要计算滚动的“质心”,即sum(price*nQty)/sum(nQty)

到目前为止我尝试过的是:

df.apply(masscenter, axis = 1)

masscenter 被单行调用5次,输出将类似于

price     87.6
nQty     739.0
Name: 1900-01-01 02:59:47.000282, dtype: float64

希望输入到masscenter,因为我可以轻松访问pricenQty使用x[0], x[1]但是,我坚持rolling.apply()阅读文档DataFrame.rolling()rolling.apply(),我认为使用'axis'in rolling()'raw'in apply可以实现类似的行为。天真的方法

rol = df.rolling(window=2)
rol.apply(masscenter)

逐行打印(增加行数直到窗口大小)

stamp
1900-01-01 02:59:47.000282    87.60
1900-01-01 03:00:01.042391    87.51
dtype: float64

然后

stamp
1900-01-01 02:59:47.000282    739.0
1900-01-01 03:00:01.042391     10.0
dtype: float64

因此,列将masscenter分别传递给(预期)。

遗憾的是,在文档中几乎没有关于的任何信息'axis'但是,显然,下一个变体是

rol = df.rolling(window=2, axis = 1)
rol.apply(masscenter)

永不masscenter加薪ValueError in rol.apply(..)

> Length of passed values is 1, index implies 5

我承认'axis'由于缺乏文档,我不确定参数及其工作方式。这是问题的第一部分:这是怎么回事?如何正确使用“轴”?它的目的是什么?

当然,以前有答案,即:

如何对熊猫数据
的两个列应用功能它适用于整个DataFrame,而不适用于滚动。

如何从多个列中调用带有参数的熊猫滚动
答案建议编写我自己的roll函数,但对我而言,罪魁祸首与注释中所问的相同:如果需要使用该函数'1T'非统一时间戳的偏移窗口大小(例如)?
我不喜欢从头开始重新发明轮子的想法。另外,我想对所有事物都使用熊猫,以防止从熊猫获得的套和“自制卷”之间出现不一致。这个问题还有另一个答案,建议分别填充数据帧并计算我需要的数据,但是它不起作用:存储的数据量很大。这里提出了相同的想法:
在具有多个参数的熊猫数据框上滚动功能

另一个在此处发布的问答集
熊猫在多个列上使用滚动
很好,并且与我的问题最接近,但是同样,无法使用偏移窗口大小(window = '1T')。

在pandas 1.0发行之前,有人提出了一些答案,并且鉴于文档可能会更好,所以我希望现在可以同时滚动多列。

问题的第二部分是:是否可以使用具有偏移窗口大小的pandas 1.0.x同时滚动多列?

非常感谢你。

地址:

这个怎么样:

def masscenter(ser):
    print(df.loc[ser.index])
    return 0

rol = df.price.rolling(window=2)
rol.apply(masscenter, raw=False)

它使用滚动逻辑从任意列获取子集。raw = False选项为您提供这些子集的索引值(作为系列提供给您),然后使用这些索引值从原始DataFrame中获取多列切片。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章