2016-01-02 3 views
0

Учитывая данные в столбцах Date и Close, я хотел бы рассчитать значения в столбце ConsecPeriodsUp. В этом столбце указано количество последовательных двухнедельных периодов, значение Close увеличилось.Расчет количества последовательных периодов, которые соответствуют условию

Date  Close  UpThisPeriod ConsecPeriodsUp     
23/12/2015 3   1    1 
16/12/2015 2   0    0 
09/12/2015 1   0    0 
02/12/2015 3   1    1 
25/11/2015 2   0    0 
18/11/2015 1   0    0 
11/11/2015 7   1    3 
04/11/2015 6   1    3 
28/10/2015 5   1    2 
21/10/2015 4   1    2 
14/10/2015 3   1    1 
07/10/2015 2   NaN    NaN 
30/09/2015 1   NaN    NaN 

Я написал следующий код, чтобы дать UpThisPeriod колонки, но я не могу видеть, как я бы агрегировать, что, чтобы получить ConsecPeriodsUp колонки, или есть ли способ сделать это в одном расчете, что я Нет.

import pandas as pd 


def up_over_period(s): 
    return s[0] >= s[-1] 


df = pd.read_csv("test_data.csv") 

period = 3 # one more than the number of weeks 

df['UpThisPeriod'] = pd.rolling_apply(
    df['Close'], 
    window=period, 
    func=up_over_period, 
    ).shift(-period + 1) 
+0

какой мощность вы ожидаете? –

+0

Ожидаемый вывод находится в столбце 'ConsecPeriodsUp'. Входные данные - это только 'Date' и' Close'. –

ответ

0

Это может быть сделано путем адаптации groupby, shift и cumsum трюк, описанный в панды Cookbook, Grouping like Python’s itertools.groupby. Основное изменение заключается в делении на длину периода - 1 и затем использовании функции ceil для округления до следующего целого.

from math import ceil 
... 

s = df['UpThisPeriod'][::-1] 

df['ConsecPeriodsUp'] = (s.groupby((s != s.shift()).cumsum()).cumsum()/(period - 1)).apply(ceil) 
Смежные вопросы