【发布时间】:2017-03-28 00:47:42
【问题描述】:
我有一个要修改的数据框。
我还有三个列表可以引用数据框的每个部分以执行计算。
signal
['signal0', 'signal1']
df_list
['A', 'B']
df_ma2_list
['A_MA', 'B_MA']
到目前为止,我的数据框还不错:
A_MA B_MA A B signal0 signal1
0 NaN NaN 50 55 0 0
1 NaN NaN 55 67 0 0
2 65.00 70.33 90 89 0 0
3 54.67 63.33 19 34 0 0
4 64.00 68.33 83 82 0 0
5 64.33 70.33 91 95 0 0
6 81.33 91.33 70 97 0 0
7 86.33 95.00 98 93 0 0
8 83.33 98.33 82 105 0 0
9 86.67 102.67 80 110 0 0
我可以对 A 列和 A_MA 列和 B 列和 B_MA 进行手动计算,以便生成 1 或 -1 的信号,如下所示:
df2.loc[df2.A > df2.A_MA, "signal0"] = -1
df2.loc[df2.A < df2.A_MA, "signal0"] = 1
df2.loc[df2.B > df2.B_MA, "signal1"] = -1
df2.loc[df2.B < df2.B_MA, "signal1"] = 1
round(df2,1)
我得到了正确的输出,其中 signal0 和 signal1 分别适用于带有 A_MA 的 A 和带有 B_MA 的 B。 因此,例如,在第 7 行中,B = 105 且 B_MA =98,因此 signal1 = -1。 同样在第 7 行,A= 82 和 A_MA = 83,所以 signal0 = 1。
A_MA B_MA A B signal0 signal1
0 NaN NaN 50 55 -1 -1
1 NaN NaN 55 67 -1 -1
2 65.0 70.3 90 89 1 1
3 54.7 63.3 19 34 -1 -1
4 64.0 68.3 83 82 1 1
5 64.3 70.3 91 95 1 1
6 81.3 91.3 70 97 -1 1
7 86.3 95.0 98 93 1 -1
8 83.3 98.3 82 105 -1 1
9 86.7 102.7 80 110 -1 1
上述方法对于更大的数据帧来说太长了。 所以我想使用三个列表的 for 循环,无论有多少列,我都必须自动计算数据框。因此,如果我有 A 到 Z 列、A_MA - Z_MA 和 signal0 到 signal26 列。它将仅根据 df_list、df_ma2_list 和 signal 三个股票代码列表计算所有信号。 我使用了这个等式,但它只在信号 0 和信号 1 列中为 B 和 B_MB 提供了相同的信号。
for i in signal:
for x in df_list:
for f in df_ma2_list:
df2.loc[df2["{}".format(x)] > df2["{}".format(f)], "{}".format(i)] = -1
df2.loc[df2["{}".format(x)] < df2["{}".format(f)], "{}".format(i)] = 1
A_MA B_MA A B signal0 signal1
0 NaN NaN 50 55 0 0
1 NaN NaN 55 67 0 0
2 65.00 70.33 90 89 -1 -1
3 54.67 63.33 19 34 1 1
4 64.00 68.33 83 82 -1 -1
5 64.33 70.33 91 95 -1 -1
6 81.33 91.33 70 97 -1 -1
7 86.33 95.00 98 93 1 1
8 83.33 98.33 82 105 -1 -1
9 86.67 102.67 80 110 -1 -1
此外,不幸的是,使用 np.where 会产生相同的数据帧问题,两个信号列具有相同的值。
import numpy as np
for f in signal:
for i in df_list:
for x in df_ma_list:
df3["{}".format(f)] = np.where((df3["{}".format(i)] > df3["{}".format(x)]), 1, -1)
df3["{}".format(f)] = np.where((df3["{}".format(i)] > df3["{}".format(x)]), 1, -1)
df3
我需要使用上面的代码和三个列表的 for 循环来为两列获取正确的信号。如果有更好的方法,请告诉我。对不起,很长的问题!非常感谢。
【问题讨论】:
-
也许看看
numpy.where。 -
您好,感谢您的建议。不幸的是,我已经尝试过 np.where 并且它给了我同样的问题。
-
您得到的 B 和 B_MB 信号相同,因为您没有将 A 与 A_MA 联系起来,将 B 与 B_MA 联系起来。更深入地看看你的 for 循环;您正在将 A 与 B 进行比较...
-
哇,谢谢!快没希望了。我看到您对所有列表只使用了一个 for 循环; ts、ma 和信号。那讲得通。大约 2-3 个月前,我才开始使用 Python 来完成我的金融数学论文。大解脱。再次感谢 not_a_robot!
-
不客气。如果您满意,请点击投票旁边的复选标记接受答案:)
标签: python list for-loop dataframe format