pandas - 获取特定日期数量的标准偏差
问题描述
在这个数据框中...
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()}
...看起来很笨重。
有没有更好的办法?
解决方案
首先过滤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}
推荐阅读
- xamarin.forms - r8 shrinker Java.Lang.NoSuchMethodError Message=xamarin 表单中没有非静态方法
- powershell - 如何在一行中将主机和添加内容写入日志文件?
- mysql - Golang MySQL Docker 连接被拒绝
- python - 从列表的ndarray转换为ndarray
- python - 如何将 wav 写入 tfrecord 然后读回
- javascript - 了解递归中的函数执行顺序
- node.js - 提交表单时获取空值
- ruby-on-rails - 如何获得 .save 失败的 rspec 覆盖率
- javascript - 获取特定类的第 nth-last-child()
- php - php Monolog udp SocketHandler 数据包大小