Добавить разные пропущенные даты для групп строк - PullRequest
0 голосов
/ 20 февраля 2019

Предположим, у меня есть набор данных, который состоит из следующих столбцов:

  • Stock_id: идентификатор акции
  • Date: дата 2018 г., например25/03/2018
  • Stock_value: стоимость акции на эту конкретную дату

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

Под пропущенными датами я подразумеваю, что нет даже строки для каждой из этих дат;не то, чтобы они существовали в наборе данных, а просто в том, что Stock_value в строках равно NA и т. д.

Ограничение состоит в том, что некоторые акции были представлены на фондовом рынке в какое-то время в 2018 году, поэтому, очевидно, я не хочузаполнить даты для этих акций, в то время как эти акции не существовали.

Под этим я подразумеваю, что если акция была представлена ​​на фондовом рынке 21/05/2018, то, очевидно, я хочу заполнить все пропущенныедаты для этой акции с 21/05/2018 по 31/12/2018, но не раньше 21/05/2018.

Какой самый эффективный способ сделать это?

IЯ видел некоторые сообщения в StackOverflow ( post_1 , post_2 и т. д.), но я думаю, что мой случай более особенный, поэтому я хотел бы найти эффективный способ сделать это.

Позвольте мне привести пример.Давайте ограничим это только двумя акциями и только неделей с 01/01/2018 по 07/07/2018, иначе это не будет соответствовать здесь.

Предположим, что у меня изначально есть следующее:

Stock_id    Date    Stock_value
1   01/01/2018  124
1   02/01/2018  130
1   03/01/2018  136
1   05/01/2018  129
1   06/01/2018  131
1   07/01/2018  133
2   03/01/2018  144
2   04/01/2018  148
2   06/01/2018  150
2   07/01/2018  147

Таким образом, для Stock_id = 1 дата 04/01/2018 отсутствует.

Для Stock_id = 2 дата 05/01/2018 отсутствует, а поскольку даты для этой акции начинаются с 01.01.2008, то даты до этой даты заполнять не следует (поскольку акция была представлена ​​на фондовом рынке в03/01/2018).

Следовательно, я хотел бы получить следующее:

Stock_id    Date    Stock_value
1   01/01/2018  124
1   02/01/2018  130
1   03/01/2018  136
1   04/01/2018  NA
1   05/01/2018  129
1   06/01/2018  131
1   07/01/2018  133
2   03/01/2018  144
2   04/01/2018  148
2   05/01/2018  NA
2   06/01/2018  150
2   07/01/2018  147

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Используйте asfreq для групп, но если производительность больших данных должна быть проблематичной:

df = (df.set_index( 'Date')
        .groupby('Stock_id')['Stock_value']
        .apply(lambda x: x.asfreq('D'))
        .reset_index()
        )
print (df)
    Stock_id       Date  Stock_value
0          1 2018-01-01        124.0
1          1 2018-01-02        130.0
2          1 2018-01-03        136.0
3          1 2018-01-04          NaN
4          1 2018-01-05        129.0
5          1 2018-01-06        131.0
6          1 2018-01-07        133.0
7          2 2018-01-03        144.0
8          2 2018-01-04        148.0
9          2 2018-01-05          NaN
10         2 2018-01-06        150.0
11         2 2018-01-07        147.0

РЕДАКТИРОВАТЬ:

Если вы хотите изменить значения на минимальное время-датагруппа с некоторым скаляром для максимума datetime, используйте reindex с date_range:

df = (df.set_index( 'Date')
        .groupby('Stock_id')['Stock_value']
        .apply(lambda x: x.reindex(pd.date_range(x.index.min(), '2019-02-20')))
        .reset_index()
        )
0 голосов
/ 20 февраля 2019

df.set_index(['Date', 'Stock_id']).unstack().fillna(method='ffill').stack().reset_index()

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