группировка по условиям прокатки - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь сгруппировать фрейм данных на основе нескольких условий.

Фрейм данных:

Start Date  End Date    value
1971-07-01  1971-07-31  0.0
1971-08-01  1971-08-31  0.25
1971-09-01  1971-09-30  -0.62
1971-10-01  1971-10-31  0.0
1971-11-01  1971-11-30  -0.63
1971-12-01  1971-12-31  -1.0
1972-01-01  1972-01-31  0.0
1972-02-01  1972-02-29  0.0
1972-03-01  1972-03-31  2.0
1972-04-01  1972-04-30  0.0
.
.
1973-07-01  1973-07-31  2.0
1973-08-01  1973-08-31  0.5
1973-09-01  1973-09-30  -2.0
1973-10-01  1973-10-31  0.0
1973-11-01  1973-11-30  0.0
1973-12-01  1973-12-31  0.0
1974-01-01  1974-01-31  0.0
1974-02-01  1974-02-28  0.0
.
.
.
1974-11-01  1974-11-30  0.0
1974-12-01  1974-12-31  -1.25
1975-01-01  1975-01-31  -1.0
1975-02-01  1975-02-28  -1.0
1975-03-01  1975-03-31  -0.5
1975-04-01  1975-04-30  -0.25
1975-05-01  1975-05-31  0.0
1975-06-01  1975-06-30  1.25
1975-07-01  1975-07-31  0.0
1975-08-01  1975-08-31  0.0

Критерии группировки

Группа должна всегда начинаться с отрицательного значения

Группа продолжается до тех пор, пока мы имеем отрицательное значение

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

Пример 1 из приведенного выше фрейма данных

1971-09-01  1971-09-30  -0.62
1971-10-01  1971-10-31  0.0
1971-11-01  1971-11-30  -0.63
1971-12-01  1971-12-31  -1.0
1972-01-01  1972-01-31  0.0
1972-02-01  1972-02-29  0.0

Пример 2 (в этом случае мы достигли 3 последовательных нулей)

1973-09-01  1973-09-30  -2.0
1973-10-01  1973-10-31  0.0
1973-11-01  1973-11-30  0.0
1973-12-01  1973-12-31  0.0

Пример 3 (в этом случае мы достигли положительного значения)

1974-12-01  1974-12-31  -1.25
1975-01-01  1975-01-31  -1.0
1975-02-01  1975-02-28  -1.0
1975-03-01  1975-03-31  -0.5
1975-04-01  1975-04-30  -0.25
1975-05-01  1975-05-31  0.0

У меня нет никакого кода, так как я все еще выясняю, как поместить условия в группу или любой другой эффективный способ сделать это.

Я пытался зациклить, но я никуда не пойду с этим.

for i in df.index:
    no = 0
    if df['Value'][i] < 0:
        df['groupno'] = no

После группировки я хочу получить дату начала первого столбца группы и дату окончания последнего столбца группы.

Ожидаемые результаты (из примеров):

Start Date   End Date
1971-09-01   1972-02-29
1973-09-01   1973-12-31
1974-12-01   1975-05-31

Спасибо за чтение.

1 Ответ

0 голосов
/ 05 июня 2019

Я думаю, что это не pythonic способ, но он работает, и я думаю, что это может быть полезно для вас.

groups = []
start = '' # start date for group
end = '' # end date for group
nulls = 0 # count of nulls
for j,i in df.iterrows():
    # if it's first negativa value - start the group
    if i.value < 0 and start == '':
        start = i['Start Date']
        nulls = 0
    # if it's null - remember that
    if i.value == 0:
        nulls += 1
    else:
        nulls = 0
    # if value > 0 or we have seen 3 nulls - end group (if it was start)
    if ( (i.value > 0) or (nulls == 3) ) and start != '':
        # if we have seen 3 nulls - we want write this end date (not previous)
        if nulls == 3:
            end = i['End Date']
        groups.append((start, end))
        start = ''
        nulls = 0
    if nulls == 3:
        start = ''
        nulls = 0
    # remember previous end date
    end = i['End Date']
result = pd.DataFrame(groups, columns = ['Start Date', 'End Date'])
print(result)

Это не group by, но это может помочь найти дату начала и окончания для ваших групп.

Из:

   Start Date    End Date
0  1971-09-01  1972-02-29
1  1973-09-01  1973-12-31
2  1974-12-01  1975-05-31
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...