Повторная выборка временных рядов Pandas с месяцем и с группой по столбцу

#python #pandas

#python #pandas

Вопрос:

Как выполнить повторную выборку индекса даты с месяцем и сгруппировать по одному столбцу и агрегированному среднему значению другого столбца.

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

                 bts_name    duration
cleareddate     
2019-01-19  1002_NUc_Marathalli 95
2019-01-21  1002_NUc_Marathalli 188
2019-02-11  1002_NUc_Marathalli 1332
2019-04-12  1002_NUc_Marathalli 940
2019-01-11  1003_IU2_Munnekolalu 73
 

Я пытаюсь с частотой месяца и группировать по bts_name и sum продолжительности каждого месяца.

Комментарии:

1. Можете ли вы уточнить «повторную выборку индекса даты с месяцем»? Вы хотите случайным образом выбирать один элемент в месяц из всех элементов в этом месяце? Или вы хотите сгруппировать как месяц, так и bts_name ? Это может помочь предоставить ожидаемый результат с вашим вопросом.

2. выходные данные должны быть сгруппированы по bts_name и месяцу (в cleareddate) и суммировать продолжительность с использованием повторной выборки

3. Опять же, ваше использование «повторной выборки» неясно. Повторная выборка обычно относится к технике в стиле bootstrap, но тогда агрегат «сумма» не имеет особого смысла. Я отправлю ответ, но просто прокомментирую, если это не то, что вы ищете.

4. можете ли вы показать нам, как должен выглядеть выходной df? Спасибо

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

Ответ №1:

Вы можете reset_index установить cleareddate поле в качестве столбца в вашем фрейме данных. Я бы создал новый столбец с месяцем, а затем вы можете выполнить это прямо groupby .

 df.reset_index(inplace=True)
df['month'] = df.cleareddate.dt.month
df.groupby(['month','bts_name']).agg('sum').duration
 

Примечания:

  1. Я предположил, что индекс имеет тип datetime. Если это не так, добавьте df.cleareddate = pd.to_datetime(df.cleareddate) строку за reset_index строкой.
  2. Обратите внимание, что месяцы за два разных года будут сгруппированы как одинаковые. Вам также нужно группировать по годам? Если это так, добавьте еще один столбец для года и добавьте этот термин в свой столбец groupby

РЕДАКТИРОВАТЬ: после обсуждения в комментариях с @sriman я включил другой способ достижения вышеуказанного с помощью метода повторной выборки pandas.

 # your data
df = pd.DataFrame({
    'bts_name': ['1002_NUc_Marathalli','1002_NUc_Marathalli',
                 '1002_NUc_Marathalli','1002_NUc_Marathalli',
                 '1003_IU2_Munnekolalu'],
    'duration': [95,188,1332,940,73]
}, index=pd.to_datetime(['2019-01-19','2019-01-21',
                         '2019-02-11','2019-04-12','2019-01-11']))


# solution
def resample(group):
    return group.resample('M').sum()

result = df.groupby('bts_name').apply(resample)

# result
print(result)

                                 duration
bts_name                                 
1002_NUc_Marathalli  2019-01-31       283
                     2019-02-28      1332
                     2019-03-31         0
                     2019-04-30       940
1003_IU2_Munnekolalu 2019-01-31        73
 

Комментарии:

1. Спасибо, это сработает, есть ли какой-нибудь способ сделать это с помощью метода повторной выборки

2. Ах, я думаю, я понимаю, о чем вы говорите. Вы хотели бы использовать этот метод здесь: pandas.pydata.org/pandas-docs/stable/reference/api /… ? Я уверен, что смогу что-то добавить к приведенному выше решению, если это так.

3. Дайте мне знать, если редактирование — это то, что вы имели в виду? Вы всегда можете ‘reset_index ()’, чтобы получить поля bts_name и date из индекса и обратно в столбцы.

4. с вашей помощью мне понравился этот df1.groupby(‘bts_name’).resample(‘M’).sum(), он работает, но требуется некоторое время для почти 1,2 тысяч записей