Python 使用依赖于另一列的值的复杂函数聚合时间序列

Posted

技术标签:

【中文标题】Python 使用依赖于另一列的值的复杂函数聚合时间序列【英文标题】:Python aggregate time series using a complex function that depends on the value from anther column 【发布时间】:2021-09-22 20:27:58 【问题描述】:

我的时间序列是这样的:

TranID,Time,Price,Volume,SaleOrderVolume,BuyOrderVolume,Type,SaleOrderID,SaleOrderPrice,BuyOrderID,BuyOrderPrice
1,09:25:00,137.69,200,200,453,B,182023,137.69,241939,137.69
2,09:25:00,137.69,253,300,453,S,184857,137.69,241939,137.69
3,09:25:00,137.69,47,300,200,B,184857,137.69,241322,137.69
4,09:25:00,137.69,153,200,200,B,219208,137.69,241322,137.69

我可以通过对所有 Volume 求和来进行聚合

res = df.resample('t').agg('Volume': 'sum')

但我想根据 volumetype 列聚合 volume 和 type 列,当 type 为 S 时添加卷,否则删除卷。如果聚合后的总体积为负数,则类型为S,否则类型为B

在上面的例子中,我聚合了体积后,总体积会变成

200 - 253 + 300 + 200 = 447

并且类型是B,因为 447 > 0

结果:

Time,Volume,Type
09:25:00,447,B

【问题讨论】:

【参考方案1】:

最简单的方法是将音量乘以 1 或 -1,具体取决于带有 map 的类型中的值。然后 assign 列类型取决于总和的结果。

res = (
    (df['Volume']*df['Type'].map('S':-1, 'B':1))
      .groupby(df['Time']).sum()#here should work with resample, 
                                #just your input is not the right format to use resample
      .reset_index(name='Volume')
      .assign(Type=lambda x: np.where(x['Volume']>0, 'B', 'S'))
)

print(res)
       Time  Volume Type
0  09:25:00     147    B # you used 2 columns to calculate your result volume 447?

【讨论】:

以上是关于Python 使用依赖于另一列的值的复杂函数聚合时间序列的主要内容,如果未能解决你的问题,请参考以下文章

如何使一个材料表列的编辑模式字段类型依赖于另一列的值,而不影响其他行?

R:基于一个列的值存在于另一列中,生成虚拟变量

检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中

如果来自一列的数据存在于另一列中,则合并两个数据框

求和列名称来自另一列的值的列

datagridviewcombobox columns 依赖于另一列