我正在尝试为系列数据生成价格变化百分比。 数据格式低于
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
如果我再次计算百分比变化函数,则表示不符合我的可接受差异。而不是多次执行此操作,是否有任何有效的方法来执行此操作。
提前致谢。
答案 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)