识别数字急剧下降点的方法
Method to identify the point where numbers fall off sharply
我有一系列数字:
numbers = [100, 101, 99, 102, 99, 98, 100, 97.5, 98, 99, 95, 93, 90, 85, 80]
很明显数字大约在 10 左右开始急剧下降,但是有没有一种简单的方法可以识别 x 轴上的那个点(或接近它的点)?
这是在回顾时完成的,因此您可以将整个数字列表用于 select 衰减加速的 x 轴点。
Python 解决方案是首选,但伪代码或通用方法也可以。
好的,这最终满足了我的需求。我从 t 分布计算 运行 均值、标准差和 cdf,以告诉我每个连续值的可能性有多大。
这只适用于减少,因为我只检查 cdf < 0.05,但效果很好。
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
numbers = np.array([100, 101, 99, 102, 99, 98, 100, 97.5, 98, 99, 95, 93, 90, 85, 80])
# Calculate a running mean
cum_mean = numbers.cumsum() / (np.arange(len(numbers)) + 1)
# Calculate a running standard deviation
cum_std = np.array([numbers[:i].std() for i in range(len(numbers))])
# Calculate a z value
cum_z = (numbers[1:] - cum_mean[:-1]) / cum_std[:-1]
# Add in NA vals to account for records without sample size
z_vals = np.concatenate((np.zeros(1+2), cum_z[2:]), axis=0)
# Calculate cdf
cum_t = np.array([stats.t.cdf(z, i) for i, z in enumerate(z_vals)])
# Identify first number to fall below threshold
first_deviation = np.where(cum_t < 0.05)[0].min()
fig, ax = plt.subplots()
# plot the numbers and the point immediately prior to the decrease
ax.plot(numbers)
ax.axvline(first_deviation-1, color='red')
我有一系列数字:
numbers = [100, 101, 99, 102, 99, 98, 100, 97.5, 98, 99, 95, 93, 90, 85, 80]
很明显数字大约在 10 左右开始急剧下降,但是有没有一种简单的方法可以识别 x 轴上的那个点(或接近它的点)?
这是在回顾时完成的,因此您可以将整个数字列表用于 select 衰减加速的 x 轴点。
Python 解决方案是首选,但伪代码或通用方法也可以。
好的,这最终满足了我的需求。我从 t 分布计算 运行 均值、标准差和 cdf,以告诉我每个连续值的可能性有多大。
这只适用于减少,因为我只检查 cdf < 0.05,但效果很好。
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
numbers = np.array([100, 101, 99, 102, 99, 98, 100, 97.5, 98, 99, 95, 93, 90, 85, 80])
# Calculate a running mean
cum_mean = numbers.cumsum() / (np.arange(len(numbers)) + 1)
# Calculate a running standard deviation
cum_std = np.array([numbers[:i].std() for i in range(len(numbers))])
# Calculate a z value
cum_z = (numbers[1:] - cum_mean[:-1]) / cum_std[:-1]
# Add in NA vals to account for records without sample size
z_vals = np.concatenate((np.zeros(1+2), cum_z[2:]), axis=0)
# Calculate cdf
cum_t = np.array([stats.t.cdf(z, i) for i, z in enumerate(z_vals)])
# Identify first number to fall below threshold
first_deviation = np.where(cum_t < 0.05)[0].min()
fig, ax = plt.subplots()
# plot the numbers and the point immediately prior to the decrease
ax.plot(numbers)
ax.axvline(first_deviation-1, color='red')