Присвоение значений столбцу на основе относительных величин других столбцов - PullRequest
0 голосов
/ 25 ноября 2018

Пожалуйста, рассмотрите ряд:

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

и т. Д. И т. П. В каждом наборе условий все столбцы должны сравниваться со всеми остальными столбцами, причем как <, так и > приметы.Короче говоря, df['relative_positions'] принимает разные значения (неважно, что) в зависимости от величины столбцов относительно друг друга (больше или меньше).

Проблема: Как вы можетеПонимаете, написание этих условий вручную практически невозможно.Можно ли как-нибудь автоматически заполнить такие списки перестановок условий?

Извините, если вопрос неопределенный.Будем рады все прояснить.

1 Ответ

0 голосов
/ 27 ноября 2018

Ваши сравнения ничего не дают, потому что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...