дата начала и окончания интервала полосы (несовместимая) в большом кадре данных - PullRequest
0 голосов
/ 29 мая 2019

У меня есть фрейм данных, который состоит из 2 столбцов. Дата - Квартальная дата Значение индикатора - колеблется от 1 до -1 для данной даты.

Date(Quarter)   Indicator Value    

1872-12-31        0.5                  
1873-03-31       -0.2                  
1873-06-30       -0.15                 
1873-09-30        0.7                  
1873-12-31        0.4                  
1874-03-31        0.9                 
1874-06-30       -0.3                  
1874-09-30       -0.1                  
1874-12-31        0.8                  

Меня интересует отрицательное значение цикла. Я хочу получить начальную и конечную дату для всех отрицательных значений, но не индивидуально. Например,

First one starts at 1873/01/01 and ends in 1873/06/30
The second one starts at 1874/04/01 and ends in 1874/09/30

Я пытался создать двоичные значения. Например, все положительные будут по-прежнему иметь ноль, а отрицательные числа будут иметь 1. Затем я могу вырезать меньшие фреймы данных и получить даты.

Кажется, я все усложняю.

def f(row):
    if row['Indicator value'] < 0:
        val = 1
    else:
        val = 0
    return val

df['Binary Value'] = df3.apply(f, axis = 1)

Фрейм данных выглядел так:

    Date(Quaterly)   Indicator Value    Binary Value 

1872-12-31        0.5                  0
1873-03-31       -0.2                  1
1873-06-30       -0.15                 1
1873-09-30        0.7                  0
1873-12-31        0.4                  0
1874-03-31        0.9                  0
1874-06-30       -0.3                  1
1874-09-30       -0.1                  1
1874-12-31        0.8                  0

Я застрял после этого. Я не знаю, куда идти отсюда.

Я хочу создать список дат начала и окончания

Start Date     End date 
1873/01/01     1873/06/30 
1874/04/01     1874/09/30

1 Ответ

1 голос
/ 29 мая 2019
g = (df['Indicator Value'].gt(0) == df['Indicator Value'].lt(0).shift()).cumsum()
g.name = 'value'

df = df.groupby(g).apply(lambda x: x.iloc[np.r_[0:1, -1:0]])

allneg = df[df['Indicator Value'].lt(0)].reset_index().drop(columns = ['value','level_1'])

pd.DataFrame(np.hstack([allneg.loc[::2, 'Date(Quarter)'].values.reshape(-1,1), allneg.loc[1::2, 'Date(Quarter)'].values.reshape(-1,1)]))\
  .rename(columns = {0:'Start Date', 1:'End Date'})

    Start Date   End Date
0   1873-03-31  1873-06-30
1   1874-06-30  1874-09-30

g - это создание групп, которые мы хотим для нашего столбца Значение индикатора. Значение возрастает всякий раз, когда меняется знак.

Затем мы группируем по g, затем применяем функцию, которая принимает первое и последнее значения в каждой группе (поэтому, если в строке 3 или более отрицательных значения, она будет принимать только первое и последнее значения).

Далее мы отфильтровываем положительные значения и делаем небольшую очистку. Наконец, мы манипулируем allneg, чтобы получить только даты начала и окончания и сделать его новым фреймом данных.

В качестве даты начала я использую начальную отрицательную дату, я не уверен, откуда вы взяли свою.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...