首页 > 解决方案 > 获取特定日期数量的标准偏差

问题描述

在这个数据框中...

import pandas as pd
import numpy as np
import datetime

tf = 365
dt = datetime.datetime.now()-datetime.timedelta(days=365)

df = pd.DataFrame({
        'Cat': np.repeat(['a', 'b', 'c'], tf),
        'Date': np.tile(pd.date_range(dt, periods=tf), 3),
        'Val': np.random.rand(3*tf)
})

如何获取特定天数内每个“猫”值的标准偏差字典 - 从大型数据集的最后一天开始?

此代码给出了 10 天的标准偏差......

{s: np.std(df[(df.Cat == s) & 
          (df.Date > today-datetime.timedelta(days=10))].Val) 
for s in df.Cat.unique()}

...看起来很笨重。

有没有更好的办法?

标签: pandas

解决方案


首先过滤boolean indexing然后聚合std,但是因为默认值ddof=1是必要的,所以将其设置为0

d1 = df[(df.Date>dt-datetime.timedelta(days=10))].groupby('Cat')['Val'].std(ddof=0).to_dict()
print (d1)
{'a': 0.28435695432581953, 'b': 0.2908486860242955, 'c': 0.2995981283031974}

另一种解决方案是使用自定义功能:

f = lambda x: np.std(x.loc[(x.Date > dt-datetime.timedelta(days=10)), 'Val'])
d2 = df.groupby('Cat').apply(f).to_dict()

解决方案之间的区别在于,如果组中的某些值不匹配条件则被删除并分配第二个解决方案NaN

d1 = {'b': 0.2908486860242955, 'c': 0.2995981283031974}

d2 = {'a': nan, 'b': 0.2908486860242955, 'c': 0.2995981283031974}

推荐阅读