Работа с временными рядами в Pandas / Python

#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