我有一个正在尝试修改的数据帧。
我还有三个列表,可以引用数据帧的每个部分来执行计算。在
signal
['signal0', 'signal1']
df_list
['A', 'B']
df_ma2_list
['A_MA', 'B_MA']
到目前为止,我的数据帧还不错:
^{pr2}$我可以手动计算a列和B列,以生成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)
我得到了正确的输出,其中信号0和信号1分别适用于A和B。 例如,在第7行中,B=105和BüMA=98,所以signal1=-1。 同样在第7行中,A=82和A_MA=83,所以信号0=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列到Z列,A列从0列到信号列26列。它将仅根据三个股票代码表(df_list、df_ma2_list和signal)计算所有信号。 我用了这个等式,但它只给出了B的相同信号,在signal0和signal1列中都有B。在
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.哪里不幸的是,由于两个信号列具有相同的值,因此会产生相同的数据帧问题。在
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循环来获得这两个列的正确信号。如果有更好的办法,请告诉我。抱歉问了这么长时间!非常感谢。在
让我们创建一些数据:
^{pr2}$接下来,我们将每个字母与相应的移动平均值(MA)和信号列配对:
对于每个正则时间序列及其移动平均值,以及相应的
signal
列,如果正则时间序列大于移动平均值,则分配-1,否则分配1。在下面我们仔细看看:
例如,对于给定的行,}而不使用}将潜在的行排除在外。在
A
等于A_MA
(在您的方法中,只需使用>
和{<=
或{对于列表,请使用zip,如下所示:
结果如下:
^{pr2}$zip_列表可用于单个for循环,如下所示:
在 希望能帮助那些可能有点困惑的人。再次感谢not_a_u机器人:)
相关问题 更多 >
编程相关推荐