Преобразование строки даты в столбец за последние N дней - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу построить модель прогнозирования временного ряда, используя такие функции, как неделя года, день недели, сезон и т. Д.

Поскольку на прогноз будут сильно влиять самые последние значения, яЯ хочу использовать значения за последние 5 дней в качестве функций, однако у меня возникли проблемы с подготовкой данных к обучению:

Моя текущая таблица выглядит следующим образом:

    date        id  score
0   2014-01-01  A   75
1   2014-01-01  B   1
2   2014-01-01  C   2
4   2014-01-02  A   84
5   2014-01-02  B   1
6   2014-01-02  C   3
8   2014-01-03  A   1
9   2014-01-03  B   1
10  2014-01-03  C   1

Итак, я хочукаждая строка выглядит следующим образом:

    date        id  score  date_1 date_2 date_3 date_4 date-5
10  2014-01-03  A   1      84     75     0      0      0 
 9  2014-01-03  B   1      1      1      0      0      0

Date_1 - это оценка A, за день до даты в столбце «date», date_2 - за два дня до этого, и так далее ...

Так что я могу предсказать следующий день, используя информацию за последние 5 дней и больше функций, которые не имеют отношения к этому вопросу.Допустимо заполнить значения NaN 0

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Сдвиг времени с использованием Timedelta

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

Вы можете справиться с этим, преобразовав DataFrame во временной ряд, а затем используя freq параметр DataFrame.shift() с pandas.Timedelta объектом.

Пример данных:

import pandas as pd
df = pd.DataFrame({'date': ['2014-01-01'] * 3 +
                           ['2014-01-02'] * 3 +
                           ['2014-01-03'] * 3,
                   'id': ['A', 'B', 'C'] * 3,
                   'score': [75, 1, 2, 84, 1, 3, 1, 1, 1]})
df.date = pd.to_datetime(df.date)
df.set_index('date', inplace=True)

Идентификаторы означают, что нам нужна пара циклов, чтобы все было отдельно:

for i in range(5):
    for id in df.id.unique():
        col = 'date_{}'.format(i+1)
        freq = pd.Timedelta('{}d'.format(i+1))
        df.loc[df.id==id, col] = df.loc[df.id==id, 'score'].shift(freq=freq)
    df[col] = df[col].fillna(0).astype(int)

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

Вывод:

           id  score  date_1  date_2  date_3  date_4  date_5
date                                                        
2014-01-01  A     75       0       0       0       0       0
2014-01-01  B      1       0       0       0       0       0
2014-01-01  C      2       0       0       0       0       0
2014-01-02  A     84      75       0       0       0       0
2014-01-02  B      1       1       0       0       0       0
2014-01-02  C      3       2       0       0       0       0
2014-01-03  A      1      84      75       0       0       0
2014-01-03  B      1       1       1       0       0       0
2014-01-03  C      1       3       2       0       0       0
0 голосов
/ 19 декабря 2018

Вы можете использовать groupby(id) и shift.Вы должны отсортировать df по дате: df.sort_values('date'), прежде чем использовать следующую команду:

for i in range(5):
    df['date_'+str(i+1)] = df.groupby('id')['score'].shift(i+1).fillna(0).astype(int)

При использовании вышеуказанной команды вы получите следующий df:

enter image description here

...