Повышение частоты дискретизации панд с использованием группового режима и повторной выборки - PullRequest
0 голосов
/ 29 января 2019

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

date уникален в каждом id.

Следующее работает, но дает мне нули, где я не хочу NaN

data.groupby('id').resample('D', on='date').sum()\
    .drop('id', axis=1).reset_index()

Следующие сообщения по какой-то причине не работают

data.groupby('id').resample('D', on='date').asfreq()\
    .drop('id', axis=1).reset_index()

data.groupby('id').resample('D', on='date').fillna('pad')\
    .drop('id', axis=1).reset_index()

Я получаю следующую ошибку: Upsampling from level= or on= selection is not supported, use .set_index(...) to explicitly set index to datetime-like

Я пытался использовать pandas.Grouperс set_index многоуровневым индексом или единичным индексом, но, похоже, он не увеличивает частоту моего столбца дат, поэтому я получаю непрерывные даты, или он не соответствует столбцу id.

Pandas - версия 0.23

Попробуйте сами:

data = pd.DataFrame({
'id': [1,1,1,2,2,2],
'date': [
    datetime(2018, 1, 1),
    datetime(2018, 1, 5),
    datetime(2018, 1, 10),
    datetime(2018, 1, 1),
    datetime(2018, 1, 5),
    datetime(2018, 1, 10)],
'value': [100, 110, 90, 50, 40, 60]})

# Works but gives zeros
data.groupby('id').resample('D', on='date').sum()
# Fails
data.groupby('id').resample('D', on='date').asfreq()
data.groupby('id').resample('D', on='date').fillna('pad')

1 Ответ

0 голосов
/ 29 января 2019

Создать DatetimeIndex и удалить параметр on из resample:

print (data.set_index('date').groupby('id').resample('D').asfreq())
                id
id date           
1  2018-01-01  1.0
   2018-01-02  NaN
   2018-01-03  NaN
   2018-01-04  NaN
   2018-01-05  1.0
   2018-01-06  NaN
   2018-01-07  NaN
   2018-01-08  NaN
   2018-01-09  NaN
   2018-01-10  1.0
2  2018-01-01  2.0
   2018-01-02  NaN
   2018-01-03  NaN
   2018-01-04  NaN
   2018-01-05  2.0
   2018-01-06  NaN
   2018-01-07  NaN
   2018-01-08  NaN
   2018-01-09  NaN
   2018-01-10  2.0

print (data.set_index('date').groupby('id').resample('D').fillna('pad'))
#alternatives
#print (data.set_index('date').groupby('id').resample('D').ffill())
#print (data.set_index('date').groupby('id').resample('D').pad())
               id
id date          
1  2018-01-01   1
   2018-01-02   1
   2018-01-03   1
   2018-01-04   1
   2018-01-05   1
   2018-01-06   1
   2018-01-07   1
   2018-01-08   1
   2018-01-09   1
   2018-01-10   1
2  2018-01-01   2
   2018-01-02   2
   2018-01-03   2
   2018-01-04   2
   2018-01-05   2
   2018-01-06   2
   2018-01-07   2
   2018-01-08   2
   2018-01-09   2
   2018-01-10   2

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

Если хотите использовать sum с пропущенными значенияминужно min_count=1 параметр - sum:

min_count : int, default 0 Требуемое количество допустимых значений для выполнения операции.Если присутствует меньшее, чем min_count значений, отличных от NA, результатом будет NA.

Новое в версии 0.22.0: добавлено по умолчанию 0. Это означает, что сумма серии всех NA или пустой серии равна 0и произведение серии «все-NA» или «пусто» равно 1.

print (data.groupby('id').resample('D', on='date').sum(min_count=1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...