请考虑以下系列:
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 }}标志。
简而言之,>
根据列相对于彼此的大小(更大或更小)采用不同的值(无关紧要)。
问题: 如您所见,手动编写这些条件几乎是不可能的。有什么方法可以自动填充此类条件排列列表吗?
很抱歉,问题不清楚。乐于澄清任何事情。
答案 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