我有以下数据框:
df
>>> TSLA MSFT
2017-05-15 00:00:00+00:00 320 68
2017-05-16 00:00:00+00:00 319 69
2017-05-17 00:00:00+00:00 314 61
2017-05-18 00:00:00+00:00 313 66
2017-05-19 00:00:00+00:00 316 62
2017-05-22 00:00:00+00:00 314 65
2017-05-23 00:00:00+00:00 310 63
max_idx = df.idxmax() # returns index of max value
>>> TSLA 2017-05-15 00:00:00+00:00
>>> MSFT 2017-05-16 00:00:00+00:00
max_value = df.max() # returns max value
>>> TSLA = 320
>>> MSFT = 69
def pct_change(first, second): # pct chg formula
return (second-first) / first*100.00
我希望在max_value
之间以及从max_idx
(df.loc[max_idx:]
)开始的每个连续值对两列进行百分比变化。只是为了确保
百分比变化不低于5%。
Example:
for TSLA: 320 with 319 = 2% for MSFT: 69 with 61 = 4%
320 with 314 = 4% 69 with 66 = 5%
320 with 313 = 5% 69 with 62 = 10%
编辑:如果您觉得难以回答,我会很高兴只提及我将用于此类操作的功能或方法类型。
注意:我只想确保百分比变化不低于5%。
答案 0 :(得分:2)
我不确定你的真假情况,但我认为你需要这样的东西,感谢@JohnGalt:
df.apply(lambda x: ((1 - x/x.max()) > 0.05).all())
或者使用你的逻辑:
df.apply(lambda x: ((x[x.idxmax()]-x)/x[x.idxmax()]*100>5).all())
输出:
TSLA False
MSFT False
dtype: bool
让我们看一栏,
约翰的公式:
1 - df.TSLA/df.TSLA.max()
返回:
2017-05-15 00:00:00+00:00 0.000000
2017-05-16 00:00:00+00:00 0.003125
2017-05-17 00:00:00+00:00 0.018750
2017-05-18 00:00:00+00:00 0.021875
2017-05-19 00:00:00+00:00 0.012500
2017-05-22 00:00:00+00:00 0.018750
2017-05-23 00:00:00+00:00 0.031250
Name: TSLA, dtype: float64
如果所有这些值都大于5,则返回True,否则返回False。
我的原始公式也适用,只需要更多的计算来做与John公式相同的事情。 最后,使用lambda函数将此公式独立地应用于每个列。