基于百分比从数据帧中删除值

2024-09-28 21:53:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为一系列数据生成价格百分比变化。 数据格式如下

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超出了我的可接受方差。有没有什么有效的方法来代替多次执行此操作。你知道吗

提前谢谢。你知道吗


Tags: 数据time格式价格productchangepriceremove
2条回答

您只需遍历从最早的行到最新的行,然后在每一步决定是否要删除该行,并将其与未删除的最后一行进行比较(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)

在看了你的评论之后,似乎这就是你想要的。我认为你可能需要一个循环。假设你有:

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不断更新,直到没有剩余的异常值为止,在这个异常值处循环被中断。你知道吗

相关问题 更多 >