如何为循环列出所有的值到一个数据帧?Python

2024-10-01 00:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个正在尝试修改的数据帧。
我还有三个列表,可以引用数据帧的每个部分来执行计算。在

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循环来获得这两个列的正确信号。如果有更好的办法,请告诉我。抱歉问了这么长时间!非常感谢。在


Tags: 数据informatdfforsignal信号nan
2条回答
>>> import pandas as pd
>>> import numpy as np
>>> import string

让我们创建一些数据:

^{pr2}$

接下来,我们将每个字母与相应的移动平均值(MA)和信号列配对:

>>> columns = [(letter, letter + '_MA', 'signal' + str(ord(letter)-65)) for letter in string.ascii_uppercase]
>>> columns
[('A', 'A_MA', 'signal0'), ('B', 'B_MA', 'signal1'), ('C', 'C_MA', 'signal2'), ('D', 'D_MA', 'signal3'), ('E', 'E_MA', 'signal4'), ('F', 'F_MA', 'signal5'), ('G', 'G_MA', 'signal6'), ('H', 'H_MA', 'signal7'), ('I', 'I_MA', 'signal8'), ('J', 'J_MA', 'signal9'), ('K', 'K_MA', 'signal10'), ('L', 'L_MA', 'signal11'), ('M', 'M_MA', 'signal12'), ('N', 'N_MA', 'signal13'), ('O', 'O_MA', 'signal14'), ('P', 'P_MA', 'signal15'), ('Q', 'Q_MA', 'signal16'), ('R', 'R_MA', 'signal17'), ('S', 'S_MA', 'signal18'), ('T', 'T_MA', 'signal19'), ('U', 'U_MA', 'signal20'), ('V', 'V_MA', 'signal21'), ('W', 'W_MA', 'signal22'), ('X', 'X_MA', 'signal23'), ('Y', 'Y_MA', 'signal24'), ('Z', 'Z_MA', 'signal25')]

对于每个正则时间序列及其移动平均值,以及相应的signal列,如果正则时间序列大于移动平均值,则分配-1,否则分配1。在

>>> for ts, ma, signal in columns:
...     df[signal] = np.where(df[ts] > df[ma], -1, 1)
... 
>>> df.head()
          A      A_MA         B      B_MA         C      C_MA         D  \
0  0.194264  1.026269 -0.754151 -0.156895  1.583709 -0.018520  0.895973   
1 -0.105569 -0.380830 -1.464730 -2.057322 -0.448863 -0.270909 -1.011525   
2  1.306095  0.003583 -0.714843  0.132892 -0.162723  0.494365 -0.702625   
3  0.194403 -0.828941  0.472967  1.218849 -0.092833  1.639822 -1.953157   
4 -0.680198  0.078923  0.939365 -0.267072  0.275587  2.262286 -0.196426   

       D_MA         E      E_MA    ...     signal16  signal17  signal18  \
0 -0.185024  0.803631 -0.415856    ...           -1         1        -1   
1 -0.784399 -0.758771  0.531884    ...            1         1        -1   
2  0.476952 -0.160694  1.397329    ...           -1         1        -1   
3  1.755312 -0.191594 -0.701020    ...            1         1        -1   
4  0.195957  1.222551  1.071865    ...            1        -1         1   

   signal19  signal20  signal21  signal22  signal23  signal24  signal25  
0        -1        -1         1        -1         1         1         1  
1         1         1         1         1        -1        -1        -1  
2        -1        -1         1        -1        -1         1        -1  
3        -1        -1        -1        -1        -1        -1         1  
4         1        -1         1         1         1         1        -1  

[5 rows x 78 columns]

下面我们仔细看看:

>>> df[list(columns[0]) + list(columns[1])].head()
          A      A_MA  signal0         B      B_MA  signal1
0  0.194264  1.026269        1 -0.754151 -0.156895        1
1 -0.105569 -0.380830       -1 -1.464730 -2.057322       -1
2  1.306095  0.003583       -1 -0.714843  0.132892        1
3  0.194403 -0.828941       -1  0.472967  1.218849        1
4 -0.680198  0.078923        1  0.939365 -0.267072       -1

例如,对于给定的行,A等于A_MA(在您的方法中,只需使用>和{}而不使用<=或{}将潜在的行排除在外。在

对于列表,请使用zip,如下所示:

   zip_list = list(zip(df_list, df_ma2_list, signal))

结果如下:

^{pr2}$

zip_列表可用于单个for循环,如下所示:

        for df_list, df_ma2_list, signal in zip_list:
              df[signal] = np.where(df[df_list] > df[df_ma2_list], -1, 1)

在 希望能帮助那些可能有点困惑的人。再次感谢not_a_u机器人:)

相关问题 更多 >