根据其他列的相对大小为列分配值

时间:2018-11-25 03:40:42

标签: python-3.x pandas

请考虑以下系列:

series = pd.Series(np.random.normal(0, 1, 100))

这里是一个移动平均值df,其中包含该系列的移动平均值,每列对应于使用window = [2, 5, 10, 15, 20, 25]中一个值的移动平均值

ma_df = pd.DataFrame()
for i in window:
    ma_df['ma'+ str(i)] = series.rolling(window = i).mean()

df = pd.concat([ma_df, series], axis =1)

df.tail()
     ma2   ma5  ma10  ma15  ma20  ma25  series
95 -0.66 -0.15  0.15 -0.02 -0.09 -0.16    0.11
96  0.28 -0.09  0.11  0.02 -0.05 -0.14    0.46
97  0.76 -0.09  0.28  0.08 -0.04 -0.07    1.06
98  1.10  0.27  0.32  0.19  0.02 -0.01    1.13
99  1.03  0.74  0.39  0.32  0.13  0.01    0.94

问题:我希望创建一列df['relative_positions'],该列根据df不同列的相对大小采用不同的值。例如,如果满足以下条件,则df['positions'] = 0:

df['relative_positions'] [(df.series > df.ma5) & (df.series > df.ma10) & (df.series < df.ma15) & (df.series > df.ma25) & (df.ma10 > df.ma25) & ....] = 0

df['positions'] = 1,如果:

df['relative_positions'] [(df.series < df.ma5) & (df.series< df.ma10) & (df.ma25 < df.ma15) & (df.ma10 < df.ma25) & (df.series < df.ma25) & ....] = 1

df['positions'] = 2,如果:

df['relative_positions'] [(df.ma20 < df.ma5) & (df.series > df.ma20) & (df.ma20 < df.ma15) & (df.ma25 < df.series) & (df.series < df.ma5) & ....] = 2

,依此类推。 。在每组条件中,必须将所有列与所有其他列进行比较,并同时使用<和{{1 }}标志。 简而言之,>根据列相对于彼此的大小(更大或更小)采用不同的值(无关紧要)。

问题: 如您所见,手动编写这些条件几乎是不可能的。有什么方法可以自动填充此类条件排列列表吗?

很抱歉,问题不清楚。乐于澄清任何事情。

1 个答案:

答案 0 :(得分:0)

您的比较没有任何结果,因为df.series始终高于相应列中的滚动平均值。不过,您可能需要np.where进行比较,如下所示:

df['relative_positions'] = np.where((df.series > df.ma5) & (df.series > df.ma10) & (**df.series > df.ma15**) & (df.series > df.ma25) & (df.ma10 > df.ma25), 0, 
                                   np.where((df.series < df.ma5) & (df.series< df.ma10) & (df.ma25 < df.ma15) & (df.ma10 < df.ma25) & (df.series < df.ma25), 1, np.where((df.ma20 < df.ma5) & (df.series > df.ma20) & (df.ma20 < df.ma15) & (df.ma25 < df.series) & (df.series < df.ma5), 2, 'empty')))

出于测试目的,我将(**df.series > df.ma15**)更改为较大而不是较低。否则,您只会得到空的。

df.tail()

     ma2   ma5  ma10  ma15  ma20  ma25  series relative_positions
95  94.5  93.0  90.5  88.0  85.5  83.0      95                  0
96  95.5  94.0  91.5  89.0  86.5  84.0      96                  0
97  96.5  95.0  92.5  90.0  87.5  85.0      97                  0
98  97.5  96.0  93.5  91.0  88.5  86.0      98                  0
99  98.5  97.0  94.5  92.0  89.5  87.0      99                  0