#python #pandas
#python #pandas
Вопрос:
У меня есть следующие данные:
AdjClose Chg RM Target
date
2014-01-16 41.733862 0.002045 0 NaN
2014-01-17 41.695141 -0.000928 1 NaN
2014-01-21 42.144309 0.010773 1 NaN
2014-01-22 41.803561 -0.008085 1 NaN
2014-01-23 41.640931 -0.003890 0 3.0
2014-01-24 41.586721 -0.001302 0 3.0
2014-01-27 41.323416 -0.006331 0 2.0
2014-01-28 41.710630 0.009370 1 2.0
2014-01-29 41.780328 0.001671 0 1.0
2014-01-30 42.701896 0.022057 0 1.0
Я уверен, что есть простой способ сделать это, но мне еще предстоит это выяснить. Для каждого дня мне нужно видеть, сколько раз за предыдущие n дней происходило движение вверх / вниз или вниз / вверх.
Мое уродливое решение состояло в том, чтобы сделать следующее для 5-дневной цели:
dd['RM']=0
dd['RM'][((dd['Chg']>0) amp; (dd['Chg'].shift(1)<0))|
((dd['Chg']<0) amp; (dd['Chg'].shift(1)>0))] = 1
dd['Target']=pd.rolling_sum(dd['RM'],window=5)
а затем просто выполните rolling_sum за предыдущие n дней.
Я хотел бы получить помощь с более элегантным решением. Спасибо.
Комментарии:
1. Не могли бы вы показать пример? И ожидаемый результат?
2. Обновлено тем, что делает мой код, где n = 5
Ответ №1:
Я бы сделал rolling_sum()
точно так же, как вы сделали, хотя я думаю, что вверх / вниз и вниз / вверх легко измеряются при изменении знака:
dd['RM'] = np.int64(np.sign(dd['Chg']) != np.sign(dd['Chg'].shift(1)))
dd['RM'].values[0] = 0