簡體   English   中英

如何在 pandas 中有效地在組內循環?

[英]How to effectively loop within groups in pandas?

我有一張這樣的桌子

import pandas as pd
import numpy as np

df = pd.DataFrame.from_dict({'date':[1,2,3,4,5,6,7,8,9,10] ,'high':[10,9,8,8,7,6,7,8,9,10],'low':[9,7,6,5,2,1,2,1,8,9],'stock':['A']*5 + ['B']*5})
日期 高的 低的 股票
1個 10 9 一種
2個 9 7 一種
3個 8個 6個 一種
4個 8個 5個 一種
5個 7 2個 一種
6個 6個 1個
7 7 2個
8個 8個 1個
9 9 8個
10 10 9

對於每只股票的每一天,我想知道今天的“高點”和低點(之后或今天)之間的最大差異是多少。 例如,在日期 1,股票 A 的最高價為 10 美元。 我查看日期 1-5,發現高價和低價之間的最大差異出現在日期 5。日期 1 的結果將是 10-2=8。在日期 2,我應該只查看日期 2 之后的“低”。

結果:

日期 高的 低的 股票 差異高低
1個 10 9 一種 8個
2個 9 7 一種 7
3個 8個 6個 一種 6個
4個 8個 5個 一種 6個
5個 7 2個 一種 5個
6個 6個 1個 5個
7 7 2個 6個
8個 8個 1個 7
9 9 8個 1個
10 10 9 1個

我目前正在使用 for 循環並且它有效。 在我的 100 萬多行表上它真的很慢。 有更好的方法嗎?

我目前的方法:

diff_high_low=[]
for gname, g in df.groupby('stock'):
    rows = g.shape[0]
    for i in range(0,rows):
            diff_high_low.append(max( g['high'].iloc[i] - g['low'].iloc[i:rows,]))
df['diff_high_low'] = diff_high_low

我們需要groupbycummin

df['diff_high_low'] = df['high'] - df.iloc[::-1].groupby('stock')['low'].cummin()
Out[273]: 
0    8
1    7
2    6
3    6
4    5
5    5
6    6
7    7
8    1
9    1
dtype: int64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM