如何在 if 语句中使用列中的前 N 个值
how to use previous N values in column in if statement
我有一个数据框df
:
df=pd.DataFrame([[47,55,47,50,200], [33,37,30,25,100],[61,65,54,57,300],[25,26,21,22,400], [25,29,23,28,410],[28,34,32,30,430],[32,31,30,28,1000]], columns=['open','high','low','close','volume'])
print(df)
open high low close volume
0 47 55 47 50 200
1 33 37 30 25 100
2 61 65 54 57 300
3 25 26 21 22 400
4 25 29 23 28 410
5 28 34 32 30 430
6 32 31 30 28 1000
我想使用以下公式将体积列中的异常值替换为 75th percentile
:
if df['volume'] > (3IQR + vol_q3):
3IQR 是体积列的 IQR*3
和 vol_q3 是卷中最后 N 个值 的 第 75 个百分位数(在本例中为最后 4 个值)。
我写的代码如下:
from collections import deque
import pandas as pd
import numpy as np
vol_q=deque()
q1 = df['volume'].quantile(0.25)
q3 = df['volume'].quantile(0.75)
iqr_3 = 3*(q3 - q1)
for idx, rows in df.iterrows():
if idx < 5:
vol_q.append(rows['volume'])
else :
vol_q.popleft()
vol_q.append(rows['volume'])
vol_q3 = np.percentile(list(vol_q), 75)
if rows['volume'] > (iqr_3 + vol_q3):
rows['volume'] = q3
输出:
open high low close volume
0 47 55 47 50 200
1 33 37 30 25 100
2 61 65 54 57 300
3 25 26 21 22 400
4 25 29 23 28 410
5 28 34 32 30 430
6 32 31 30 28 420
它可以正常工作,但对于我拥有的数据量来说太慢了。有没有其他方法可以更快地实现它?
如何使用应用程序使用以前的 N 个值?
欢迎提出任何建议。
谢谢
v = df.volume # other columns not relevant to question
q = v.rolling(4).quantile(0.75) # 75th percentile of last 4
r = v.where(v <= iqr_3 + q, q3)
q
是矢量化滚动分位数,计算速度快,无循环。 r
是结果,这有点难以从你的问题中验证,因为你的示例数据似乎不包含足以触发条件的极端值,但我认为你明白了这个想法。
我有一个数据框df
:
df=pd.DataFrame([[47,55,47,50,200], [33,37,30,25,100],[61,65,54,57,300],[25,26,21,22,400], [25,29,23,28,410],[28,34,32,30,430],[32,31,30,28,1000]], columns=['open','high','low','close','volume'])
print(df)
open high low close volume
0 47 55 47 50 200
1 33 37 30 25 100
2 61 65 54 57 300
3 25 26 21 22 400
4 25 29 23 28 410
5 28 34 32 30 430
6 32 31 30 28 1000
我想使用以下公式将体积列中的异常值替换为 75th percentile
:
if df['volume'] > (3IQR + vol_q3):
3IQR 是体积列的 IQR*3
和 vol_q3 是卷中最后 N 个值 的 第 75 个百分位数(在本例中为最后 4 个值)。
我写的代码如下:
from collections import deque
import pandas as pd
import numpy as np
vol_q=deque()
q1 = df['volume'].quantile(0.25)
q3 = df['volume'].quantile(0.75)
iqr_3 = 3*(q3 - q1)
for idx, rows in df.iterrows():
if idx < 5:
vol_q.append(rows['volume'])
else :
vol_q.popleft()
vol_q.append(rows['volume'])
vol_q3 = np.percentile(list(vol_q), 75)
if rows['volume'] > (iqr_3 + vol_q3):
rows['volume'] = q3
输出:
open high low close volume
0 47 55 47 50 200
1 33 37 30 25 100
2 61 65 54 57 300
3 25 26 21 22 400
4 25 29 23 28 410
5 28 34 32 30 430
6 32 31 30 28 420
它可以正常工作,但对于我拥有的数据量来说太慢了。有没有其他方法可以更快地实现它? 如何使用应用程序使用以前的 N 个值?
欢迎提出任何建议。 谢谢
v = df.volume # other columns not relevant to question
q = v.rolling(4).quantile(0.75) # 75th percentile of last 4
r = v.where(v <= iqr_3 + q, q3)
q
是矢量化滚动分位数,计算速度快,无循环。 r
是结果,这有点难以从你的问题中验证,因为你的示例数据似乎不包含足以触发条件的极端值,但我认为你明白了这个想法。