Заполните пропущенные даты в группе с определенной частотой с несколькими столбцами - PullRequest
0 голосов
/ 02 февраля 2019

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

ID      DATE         VALUE_1   Value_2 ...
1    31-01-2006        5         "USD"  
1    31-01-2007        5         "USD"
1    31-01-2008        10        "USD"
1    31-01-2011        11        "USD"
2    31-12-2006        5         "USD"
2    31-12-2007        5         "USD"
2    31-12-2008        5         "USD"
2    31-12-2009        5         "USD"

С дополнительными столбцами X.

Как вы можете видеть, это данные панели с несколькими записями в одну и ту же дату для разных идентификаторов,Что я хочу сделать, это заполнить пропущенные даты для каждого идентификатора.Вы можете видеть, что для идентификатора «1» существует скачок в месяцах между второй и третьей записью.

Мне бы хотелось, чтобы датафрейм выглядел так, как показано ниже - имейте в виду, что я ищу решение, которое работает для фреймов данных со многими столбцами значений +30 и многими идентификаторами (1000+), и при этом остается эффективным,Т.е. не должно быть никакого заполнения данных для идентификаторов, которые уже «завершены», что означает, что они уже имеют частоту, указанную в данных.В этом случае годовая частота.Имейте в виду, однако, что, хотя они имеют годовую частоту, они не всегда следуют календарному году.

ID      DATE         VALUE_1   Value_2 ...
1    31-01-2006        5         "USD"  
1    31-01-2007        5         "USD"
1    31-01-2008        10        "USD"
1    31-01-2009        NA          NA
1    31-01-2010        NA          NA
1    31-01-2011        11        "USD"
2    31-12-2006        5         "USD"
2    31-12-2007        5         "USD"
2    31-12-2008        5         "USD"
2    31-12-2009        5         "USD"

1 Ответ

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

Вот полностью гибкое решение:

def resample_custom_freq(data):
    """ Resample datetime using different time offsets """

    # Compute the offsets
    month = data['Month'][0] - 1
    day = data['Day'][0] - 1

    # Modify data
    data = data.resample('AS').last().drop('ID', axis=1).reset_index().reset_index()
    data.loc[:, 'DATE'] += pd.offsets.MonthOffset(month)
    data.loc[:, 'DATE'] += pd.offsets.DateOffset(day)
    return data

df['DATE'] =  pd.to_datetime(df['DATE'])
df['Month'] = df['DATE'].dt.month
df['Day'] = df['DATE'].dt.day
df.set_index('DATE', inplace=True, drop=True)
df_1 = df.groupby('ID').apply(resample_custom_freq).reset_index().drop(['level_1', 'index', 'Month', 'Day'], axis=1)

df_1
Out[264]: 
   ID       DATE  VALUE_1 Value_2
0   1 2006-01-31      5.0   "USD"
1   1 2007-01-31      5.0   "USD"
2   1 2008-01-31     10.0   "USD"
3   1 2009-01-31      NaN     NaN
4   1 2010-01-31      NaN     NaN
5   1 2011-01-31     11.0   "USD"
6   2 2006-12-31      5.0   "USD"
7   2 2007-12-31      5.0   "USD"
8   2 2008-12-31      5.0   "USD"
9   2 2009-12-31      5.0    "USD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...