gpt4 book ai didi

python - 计算 Pandas 数据框中的滚动 z 分数

转载 作者:太空狗 更新时间:2023-10-29 20:48:56 26 4
gpt4 key购买 nike

是否有像https://turi.com/products/create/docs/generated/graphlab.toolkits.anomaly_detection.moving_zscore.create.html这样的开源函数来计算移动z-分数.我可以访问 pandas rolling_std 来计算 std,但想看看它是否可以扩展以计算滚动 z 分数。

最佳答案

rolling.apply使用自定义函数比使用内置滚动函数(例如 mean 和 std)慢得多。因此,根据滚动平均值和滚动标准计算滚动 z 分数:

def zscore(x, window):
r = x.rolling(window=window)
m = r.mean().shift(1)
s = r.std(ddof=0).shift(1)
z = (x-m)/s
return z

根据 this page 给出的定义滚动 z 分数取决于当前点之前的滚动平均值和标准差。 shift(1)上面用到了这个效果。


下面,即使对于一个小系列(长度为 100),zscore比使用 rolling.apply 快 5 倍以上.自 rolling.apply(zscore_func)电话 zscore_func对于本质上是 Python 循环中的每个滚动窗口一次,使用 Cythonized r.mean() 的优势和 r.std()随着循环规模的增加,功能变得更加明显。因此,随着 Series 的长度增加,zscore 的速度优势增加。

In [58]: %timeit zscore(x, N)
1000 loops, best of 3: 903 µs per loop

In [59]: %timeit zscore_using_apply(x, N)
100 loops, best of 3: 4.84 ms per loop

这是用于基准测试的设置:

import numpy as np
import pandas as pd
np.random.seed(2017)

def zscore(x, window):
r = x.rolling(window=window)
m = r.mean().shift(1)
s = r.std(ddof=0).shift(1)
z = (x-m)/s
return z


def zscore_using_apply(x, window):
def zscore_func(x):
return (x[-1] - x[:-1].mean())/x[:-1].std(ddof=0)
return x.rolling(window=window+1).apply(zscore_func)

N = 5
x = pd.Series((np.random.random(100) - 0.5).cumsum())

result = zscore(x, N)
alt = zscore_using_apply(x, N)

assert not ((result - alt).abs() > 1e-8).any()

关于python - 计算 Pandas 数据框中的滚动 z 分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47164950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com