2016-09-30 2 views
2

У меня есть следующие данные:Работа с временными рядами в панды/Python

  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 дней было движение вверх/вниз или вниз/вверх.

Мой некрасивым решением было сделать следующее за 5day Цель:

dd['RM']=0 
dd['RM'][((dd['Chg']>0) & (dd['Chg'].shift(1)<0))| 
     ((dd['Chg']<0) & (dd['Chg'].shift(1)>0))] = 1 
dd['Target']=pd.rolling_sum(dd['RM'],window=5) 

, а затем просто сделать rolling_sum за предыдущие п дней.

Я хотел бы помочь с более элегантным решением. Спасибо.

+0

Не могли бы вы показать пример? И ожидаемый результат? –

+0

Обновлен тем, что делает мой код где n = 5 – trubby317

ответ

2

Я хотел бы сделать rolling_sum() точно так, как вы сделали, хотя я думаю, вверх/вниз и вниз/вверх легко измеряется как , когда знак меняется:

dd['RM'] = np.int64(np.sign(dd['Chg']) != np.sign(dd['Chg'].shift(1))) 
dd['RM'].values[0] = 0 
Смежные вопросы