1 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以找到 0 線下方的最大面積。我生成了自己的數(shù)據(jù)
x = np.random.randn(100000) x = x.cumsum()-x.mean() plt.plot(x);
現(xiàn)在計(jì)算正序列和負(fù)序列的起點(diǎn)和終點(diǎn)。序列中的每個(gè)值都會(huì)獲得一個(gè)遞增的整數(shù),以便能夠按序列進(jìn)行分組。
x1 = np.diff(x < 0).cumsum()
使用 pandas groupby 計(jì)算所有區(qū)域并找到最大的負(fù)數(shù)
df = pd.DataFrame({
'value': x[1:],
'border': x1
})
dfg = df.groupby('border')
mingr = dfg.apply(lambda x: np.trapz(x.value)).idxmin()
plt.plot(x[1:])
plt.plot(
dfg.get_group(mingr).value
);
plt.title(
"position from {} to {}".format(
dfg.get_group(mingr).index[0],
dfg.get_group(mingr).index[-1]));
這是如何運(yùn)作的
我創(chuàng)建了一個(gè)更容易遵循的數(shù)據(jù)集
x = np.array([3,4,4.5,3,2])
X = np.r_[x,-x,x,-x]+np.random.normal(0,.2,20)
plt.figure(figsize=(12,5))
plt.axhline(0, color='gray')
plt.plot(X, 'o--');
我想知道具有連續(xù)負(fù)值或正值的序列。這可以使用過濾器 X < 0 進(jìn)行存檔。
df = pd.DataFrame({'value': X, 'lt_zero': X < 0})
df[:10]
value lt_zero
0 3.125986 False
1 3.885588 False
2 4.580410 False
3 2.998920 False
4 1.913088 False
5 -2.902447 True
6 -3.986654 True
7 -4.373026 True
8 -2.878661 True
9 -1.929964 True
現(xiàn)在,當(dāng)我比較每個(gè)連續(xù)值時(shí),我可以找到符號(hào)發(fā)生變化的索引。我在數(shù)據(jù)之前連接一個(gè) False,以免丟失第一個(gè)值。
df['sign_switch'] = np.diff(np.r_[False, X < 0])
df[:10]
value lt_zero sign_switch
0 3.125986 False False
1 3.885588 False False
2 4.580410 False False
3 2.998920 False False
4 1.913088 False False
5 -2.902447 True True
6 -3.986654 True False
7 -4.373026 True False
8 -2.878661 True False
9 -1.929964 True False
我為cumsum()每個(gè)序列得到一個(gè)遞增的整數(shù)值?,F(xiàn)在我為每個(gè)序列都有一個(gè)分組變量。
df['sign_sequence'] = np.diff(np.r_[False, X < 0]).cumsum()
df[:10]
value lt_zero sign_switch sign_sequence
0 3.125986 False False 0
1 3.885588 False False 0
2 4.580410 False False 0
3 2.998920 False False 0
4 1.913088 False False 0
5 -2.902447 True True 1
6 -3.986654 True False 1
7 -4.373026 True False 1
8 -2.878661 True False 1
9 -1.929964 True False 1
對(duì)于每個(gè)組,我可以計(jì)算組中值的積分。
sign_groups = df.groupby('sign_sequence')
sign_groups.apply(lambda x: np.trapz(x.value))
sign_sequence
0 13.984455
1 -13.654547
2 14.370044
3 -14.549090
您可以稍后訪問每個(gè)組并使用這些區(qū)域。例如繪制區(qū)域。
plt.figure(figsize=(12,5))
plt.plot(X,'o--')
plt.axhline(0, c='gray')
for e,group in enumerate(sign_groups):
plt.fill_between(group[1].index,0, group[1].value)
area = np.trapz(group[1].value)
plt.text((e)*5+1.5, np.sign(area) * 1.25, f'{area:.2f}', fontsize=12)
添加回答
舉報(bào)