我在表格中有我的FPS数据,例如:
T:FPS
1:30
2:15
3:25
4:26
5:20
等
我想找到FPS 稳定性指数。 FPS的所有值的总和除以数字?它只是平均值,但不确定它是否会显示我正在寻找的数据。我不擅长统计并寻求任何帮助。我想用Python编写它,但语言并不重要,更重要的是计算逻辑。 谢谢。
答案 0 :(得分:0)
我假设"稳定性指数的定义"取自以下问题:Population stability index
首先要求有2个系列:基础和目标。如果你没有它们,我找不到"稳定性指数"的定义。这可以使你的情况。相反,您可能对FPS系列的standard deviation感兴趣。
要计算列表fps
的数字的stdev,您可以使用以下代码:
from math import sqrt
fps = [30, 15, 25, 26, 20]
fps_stdev = sqrt(sum(x**2 for x in fps)/len(fps)-(sum(fps)/len(fps))**2)
# fps_stdev == 5.192301994298871
计算平均值,减去平均值的平方,最后提取平方根。
编辑:以下代码应将人口稳定性指数计算为defined。您可以将bins
和target
更改为不同的长度和值。我建议将目标定为25到35之间的均匀分布。
import math
fps = [30, 15, 25, 26, 20, 15, 20, 30, 26, 25]
bins = [0, 25, 30, 35, 1000]
target = [0.001,0.499,0.499,0.001]
base = [sum(1 for x in fps if low<=x<high)/len(fps)
for low, high in zip(bins[:-1],bins[1:])]
psi = sum((a-b)*math.log((a+1e-9)/b) for a, b in zip(base, target))
# psi == 2.7065829626120728
或者在使用numpy的函数中:
import numpy as np
bins = [0, 25, 30, 35, 1000]
target = np.array([0.001,0.499,0.499,0.001])
def psi(fps):
base = np.histogram(fps, bins=bins)[0]/len(fps)
return np.sum((base-target)*np.log(1e-9 + base/target))
其中给出了以下结果:
psi([30, 15, 25, 26, 20, 15, 20, 30, 26, 25]) # 2.7065829626120728
psi(np.random.uniform(20,40,[1000000])) # 3.0929707119205654
psi(np.random.uniform(24,36,[1000000])) # 0.75734794293362917
psi(np.random.uniform(25,35,[1000000])) # 0.041450536356554171
psi(np.random.uniform(26,34,[1000000])) # 0.041450567333546476
psi(np.random.uniform(29,31,[1000000])) # 0.041450706905843779
psi(np.random.uniform(29,37,[1000000])) # 1.9470356968069937
psi(np.random.uniform(29,60,[1000000])) # 7.0800113672962866
psi(np.random.uniform(35,60,[1000000])) # 27.603390094813619
psi(np.random.uniform(0, 25,[1000000])) # 27.603390094813619
请注意np.log(1e-9 + base/target)
:如果基本bin为空,那么1e-9
会避免日志转到-inf,但上面结果的最后几行对{的任意选择非常敏感{1}}。记在心上。此外,目标箱必须> 0以避免被零除。