根据百分比变化从数据框中删除值

问题描述 投票:0回答:2

我正在尝试为系列数据生成价格变化百分比。数据格式低于此格式

product   time    Price
ACB       2017-01  100
ACB       2017-02  102
ACB       2017-03  101
ACB       2017-04  140
ACB       2017-05  130
ACB       2017-06  105

现在我需要计算这段时间内价格的百分比变化。一旦我们计算了这些值,它将采用以下格式

product   time    Price   percnt_change
ACB       2017-01  100       
ACB       2017-02  102     0.02
ACB       2017-03  101    -0.0098
ACB       2017-04  140     0.386139
ACB       2017-05  130    -0.07143
ACB       2017-06  105    -0.19231

我的要求是删除超过10%变化的值(正面和负面)。我尝试使用以下公式删除该值

df2=df1_remove.loc[lambda df1_remove:abs(df1_remove.percnt_change)<=.1]

所以从上面的数据框中,我们将删除2017-04和2017-06值。

product   time    Price  percnt_change
ACB       2017-01  100      
ACB       2017-02  102     0.02
ACB       2017-03  101    -0.0098
ACB       2017-05  130    0.2871

如果我再次计算百分比变化函数,那么2017-05就超出了我可接受的差异。不是多次执行此操作,而是有任何有效的方法来执行此操作。

提前致谢。

python pandas dataframe
2个回答
1
投票

看完你的评论后,看起来这可能就是你所追求的。我纠正了你可能需要一个循环。说你有:

print(data)

  product    time  Price
0     ACB 2017-01    100
1     ACB 2017-02    102
2     ACB 2017-03    101
3     ACB 2017-04    140
4     ACB 2017-05    130
5     ACB 2017-06    105

要获得所需的输出用途:

def check_outliers(df, threshold=0.10):
    return df['Price'].pct_change().abs().gt(threshold).any()

while True:
    data['percnt_change'] = data['Price'].pct_change()
    mask = data['percnt_change'].abs() < 0.10
    data = data.loc[mask]
    if not check_outliers(data):
        break

这是做什么的:

  • check_outliers计算(更新的)百分比变化,如果任何变化的绝对值超过阈值,则返回True。
  • while True循环本身就是一个无限循环。 data不断更新,直到没有剩余的异常值,循环被打破。

-1
投票

您可以遍历从最旧的行到最新的行,并在每个步骤决定是否要删除它,将它与未删除的最后一行(accepted_rows[-1])进行比较:

all_rows = [...]
accepted_rows = all_rows[0:1] # initially just first row

for current_row in all_rows[1:]:
    if price_change_between(accepted_rows[-1], current_row) <= 0.1:
        accepted_rows.append(current_row)
© www.soinside.com 2019 - 2024. All rights reserved.