我的图表看起来像一封信" L"在镜子里或像这样:___ / 图的第一部分的斜率是+/- 0(但它不是零!)我想定义精确的点,图表开始弯曲(斜率> 0。)。
path = '/storage/.../01_python_in/'
test = np.loadtxt(path+'sample_data.txt', skiprows=0)
window = 10
slope_value = []
for j in range(len(test) - window):
slope, intercept, r_value, p_value, std_err = stats.linregress(test[j:j+window])
if slope > 0.2:
slope_value.append(slope)
print slope
else:
slope_value.append(0)
这可行,但我有两个问题:
1)我的输出是i + 10个元素的斜率数组。如何找出非零的第一个元素的索引是什么,因此我可以读出我的测试中的数据点"数据(对不起,这是基本的,但我是一个蟒蛇新手)? 2)我的实际数据看起来并不完全线性,因为它包含一些噪音。我的解决方案有两个变量('窗口'和斜率> 0.2),我只能猜测(估计)。是否有更优雅的解决方案? 谢谢你的帮助!
答案 0 :(得分:0)
(1)按照here所述尝试next(i for i,v in enumerate(slope_value) if v > 0)
(2)也许吧。我说您的解决方案的适用性取决于您应用的模型是否适合您的数据,或者适合生成数据的过程。您可能需要经过一些试验和错误才能找到两个参数(窗口长度和斜率阈值)的最佳值。
答案 1 :(得分:0)
尝试列表理解。
如果列表slope_value与其他数据配对使用:
>>> slope_value = [0,0,0,0,0,1,2,2,3,4,5,6]
>>> x = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> [X for (X,A) in sorted(zip(x,slope_value)) if A > 0][0]
6
否则你可以找到第一个非零的索引,如下所示:
>>> [X for (X,A) in sorted(zip(range(len(slope_value)),slope_value)) if A > 0][0]
5