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

时间:2017-12-18 23:02:49

标签: python pandas dataframe

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

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

如果我再次计算百分比变化函数,则表示不符合我的可接受差异。而不是多次执行此操作,是否有任何有效的方法来执行此操作。

提前致谢。

2 个答案:

答案 0 :(得分: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 :(得分:-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)