我有产品价格的DataFrame,它有产品和日期的MultiIndex,而且列是几家商店的销售。
例如:
d1 d2 d3 d4 d5 d6
Date
2000-01-03 -0.084321 -0.070914 -0.151308 -0.111111 -0.126745 -0.171419
2000-01-04 0.014642 -0.073155 -0.029257 -0.046330 -0.095118 -0.148168
2000-01-05 -0.086530 -0.043265 -0.060092 -0.108177 -0.160461 -0.067307
2000-01-06 0.057364 0.028943 -0.023697 -0.080934 0.021044 0.057237
2000-01-07 -0.017588 -0.017847 -0.002495 -0.025129 0.009427 0.009427
我想看看>的区别5%,或者< -5%,但我需要它是连续的,意思是 - 首先检查d1,如果不匹配,检查d2 ......
最终结果应为具有该字段的numpy.sign结果的新系列(因此-1表示< -5%,+1表示> 5%)
Signal
Date
2000-01-03 -1
2000-01-04 -1
2000-01-05 -1
2000-01-06 1
2000-01-07 0
我正在尝试使用DataFrame的apply函数,但我无法理解如何在列上按顺序执行此操作。
有没有人知道如何解决这个问题? 感谢。
答案 0 :(得分:1)
阅读文档我认为np.sign在这种情况下用于断点而不是你想要的范围。
df.apply接受一个函数(lambda或def),你也应该发送轴参数(0表示col,1表示行):
import pandas as pd
df = pd.DataFrame({'d1': {'2000-01-03': -0.08432100000000001,
'2000-01-04': 0.014641999999999999,
'2000-01-05': -0.08653,
'2000-01-06': 0.047363999999999996,
'2000-01-07': -0.017588},
'd2': {'2000-01-03': -0.070914,
'2000-01-04': -0.073155,
'2000-01-05': -0.043265,
'2000-01-06': 0.028943,
'2000-01-07': -0.017847},
'd3': {'2000-01-03': -0.151308,
'2000-01-04': -0.029257,
'2000-01-05': -0.06009199999999999,
'2000-01-06': -0.023697,
'2000-01-07': -0.002495},
'd4': {'2000-01-03': -0.11111099999999999,
'2000-01-04': -0.04633,
'2000-01-05': -0.108177,
'2000-01-06': -0.080934,
'2000-01-07': -0.025129},
'd5': {'2000-01-03': -0.126745,
'2000-01-04': -0.095118,
'2000-01-05': -0.160461,
'2000-01-06': 0.021044,
'2000-01-07': 0.009427},
'd6': {'2000-01-03': -0.17141900000000002,
'2000-01-04': -0.148168,
'2000-01-05': -0.067307,
'2000-01-06': 0.057237,
'2000-01-07': 0.009427}})
代码:
def ret_Signal(x):
for i in x:
if i > 0.05:
return 1
elif i < -0.05:
return -1
return 0
df.apply(ret_Signal, axis = 1)
返回:
2000-01-03 -1
2000-01-04 -1
2000-01-05 -1
2000-01-06 -1
2000-01-07 0
答案 1 :(得分:0)
这不是最漂亮的方式,但你可以使用带有多个if语句的lambda调用apply函数,如下所示:
df['Signal'] = df.apply(lambda x: 1 if x.d1 > 0.1 else -1 if x.d2 < -0.1 else 0, axis=1)