pandas算加权平均值_python – 为pandas中的不规则时间序列创建加权平均值

从具有可变时间步长的模拟数据我有一个不规则的时间向量作为我的值的索引,它们存储在pandas.DataFrame中.

让我们考虑一个简化的测试用例:

import pandas as pd

import datetime

time_vec = [datetime.time(0,0),datetime.time(0,0),datetime.time(0,5),datetime.time(0,7),datetime.time(0,10)]

df = pd.DataFrame([1,2,4,3,6],index = time_vec)

使用正常的df.mean()函数将得到答案3.2,只有当时间向量是等距的时才会出现这种情况.

我认为正确的结果是3.55,第一个时间步长(零秒长),平均值是1.5,对于第二个时间步,平均值是3(五分钟长)等,这导致:

1.5 * 0 + 3*5 + 3.5 * 2 + 4.5 * 3 = 35.5

结果平均为3.55(35.5 /(0 5 2 3)).

有没有一种有效的方法来做大熊猫?

这应该最终会产生类似的结果

df.resample('15M',how = 'This very Method I am looking for')

用等距时间向量创建平均值.

最佳答案 好吧,我想出了如何解决我的问题.我不知道,如果这是一个很好的解决方案,但它的确有效.

我通过datetime.datetime交换datetime.time来更改问题中的原始代码,否则它将无效(datetime.time-Objects没有方法total_seconds()).我还必须导入numpy才能使用numpy.average.

所以现在的代码是:

import datetime

import numpy as np

import pandas as pd

time_vec = [datetime.datetime(2007,1,1,0,0)

,datetime.datetime(2007,1,1,0,0)

,datetime.datetime(2007,1,1,0,5)

,datetime.datetime(2007,1,1,0,7)

,datetime.datetime(2007,1,1,0,10)]

df = pd.DataFrame([1,2,4,3,6],index = time_vec)

这个小功能解决了我的问题:

def time_based_weighted_mean(tv_df):

time_delta = [(x-y).total_seconds() for x,y in zip(df.index[1:],df.index[:-1])]

weights = [x+y for x,y in zip([0]+ time_delta,time_delta+[0])]

res = np.average(df[0],weights = weights)

return res

print time_based_weighted_mean(df[0])

我首先尝试使用pd.index.diff()来计算time_delta-Array,但这导致了一个numpy.datetime64系列,我不知道如何将它们转换为浮点数,因为np.average需要浮点数作为输入 – 重量类型.

我很感谢任何改进代码的建议.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值