YGA*_*YGA 64 python numpy weighted standard-deviation statsmodels
numpy.average()
有一个权重选项,但numpy.std()
没有.有没有人有解决方法的建议?
Eri*_*got 111
以下简短的"手动计算"怎么样?
def weighted_avg_and_std(values, weights):
"""
Return the weighted average and standard deviation.
values, weights -- Numpy ndarrays with the same shape.
"""
average = numpy.average(values, weights=weights)
# Fast and numerically precise:
variance = numpy.average((values-average)**2, weights=weights)
return (average, math.sqrt(variance))
Run Code Online (Sandbox Code Playgroud)
MSe*_*ert 28
有一个类statsmodels
可以很容易地计算加权统计数据:statsmodels.stats.weightstats.DescrStatsW
.
假设这个数据集和权重:
import numpy as np
from statsmodels.stats.weightstats import DescrStatsW
array = np.array([1,2,1,2,1,2,1,3])
weights = np.ones_like(array)
weights[3] = 100
Run Code Online (Sandbox Code Playgroud)
您初始化类(请注意,您必须传递校正因子,此时的delta 自由度):
weighted_stats = DescrStatsW(array, weights=weights, ddof=0)
Run Code Online (Sandbox Code Playgroud)
然后你可以计算:
.mean
的加权平均值:
>>> weighted_stats.mean
1.97196261682243
Run Code Online (Sandbox Code Playgroud).std
所述加权的标准偏差:
>>> weighted_stats.std
0.21434289609681711
Run Code Online (Sandbox Code Playgroud).var
的加权方差:
>>> weighted_stats.var
0.045942877107170932
Run Code Online (Sandbox Code Playgroud)>>> weighted_stats.std_mean
0.020818822467555047
Run Code Online (Sandbox Code Playgroud)
如果你对标准误差和标准偏差之间的关系感兴趣:标准误差是(for ddof == 0
)计算为加权标准偏差除以权重之和减去1的平方根(对应的statsmodels
版本来源)GitHub上的0.9):
standard_error = standard_deviation / sqrt(sum(weights) - 1)
Run Code Online (Sandbox Code Playgroud)