第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

求曲線下最大面積 | 熊貓、matplotlib

求曲線下最大面積 | 熊貓、matplotlib

嚕嚕噠 2023-08-08 17:28:33
我在這方面有點(diǎn)掙扎 - 為了找到必要的電池容量,我需要分析一年的生產(chǎn)/需求數(shù)據(jù)。為此,我認(rèn)為需要計(jì)算 0 線下方的最大面積。我想我需要找到該區(qū)域的起點(diǎn)/終點(diǎn)并將所有內(nèi)容乘以其各自的 y 值?這是我的圖表的簡化版本:這是圖像中 0 下方的最大區(qū)域,但在完整數(shù)據(jù)集中它可以是任何區(qū)域。我知道如何在找到相關(guān)區(qū)域邊界的情況下將其集成,但我正在努力尋找一種有效的方法來做到這一點(diǎn)。我的數(shù)據(jù)框如下所示:                     demand  Production    diffTime2019-01-01 00:15:01   17.25      32.907  15.6572019-01-01 00:30:01   17.80      32.954  15.154...                     ...         ...     ...2019-01-16 22:15:02   17.34      27.704  10.3642019-01-16 22:30:01   18.67      35.494  16.824我使用此代碼片段來查找最長區(qū)域的時(shí)間步長,但我缺少是否有辦法將點(diǎn)乘以它們的 y 值(差異)。然而,從技術(shù)上講,這是不正確的,考慮到一個(gè)區(qū)域可能長而窄,而另一個(gè)區(qū)域可能又短又高,因此整體區(qū)域更大。def max0(sr):     return (sr >= 0).cumsum().value_counts().max() - (0 if (sr >= 0).cumsum().value_counts().idxmax() < 0 else 1)
查看完整描述

1 回答

?
aluckdog

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);

https://img1.sycdn.imooc.com//64d20b0500012b3b05840380.jpg

現(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]));

https://img1.sycdn.imooc.com//64d20b120001035405830399.jpg

這是如何運(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--');

https://img1.sycdn.imooc.com//64d20b210001545c07040296.jpg

我想知道具有連續(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)

https://img1.sycdn.imooc.com//64d20b32000187c107030300.jpg

查看完整回答
反對(duì) 回復(fù) 2023-08-08
  • 1 回答
  • 0 關(guān)注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)