Агрегирование данных временных рядов по нескольким столбцам

                     rand_val  new_val           copy_time
2020-10-15 00:00:00         7       26 2020-10-15 00:00:00
2020-10-15 00:00:10         8       29 2020-10-15 00:00:10
2020-10-15 00:00:20         1       53 2020-10-15 00:00:20
2020-10-15 00:03:50         6       69 2020-10-15 00:03:50
2020-10-15 00:04:00         3       19 2020-10-15 00:04:00

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

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

df.resample("1min").apply(lambda x: sum(x.rand_val) if len(x)>1 else 0) 

Я получаю сообщение об ошибке:

AttributeError: 'Series' object has no attribute 'rand_val'

Это было бы возможно, если бы я сделал groupby для какой-то другой переменной. Я думаю, что функция повторной выборки не то же самое. Любые идеи?


person Borut Flis    schedule 23.12.2020    source источник
comment
попробуй df.resample('1min',on='copy_time').apply(...)   -  person Joe Ferndz    schedule 23.12.2020


Ответы (2)


Это хороший вопрос!. Когда мы делаем groupby определенные столбцы, каждый фрагмент данных обрабатывается как DataFrame pandas. Таким образом, мы можем получить доступ к столбцу, как обычно. Но в данном случае resample это сериал.

Один из способов получить только rand_val — передать эту серию напрямую следующим образом:

df.resample("1min")['rand_val'].apply(lambda x: sum(x) if len(x)>1 else 0) 

Я предполагаю, что ваш индекс находится в формате даты и времени. В противном случае, пожалуйста, преобразуйте его с помощью pd.to_datetime следующим образом:

df.index=pd.to_datetime(df.index)
person LazyCoder    schedule 23.12.2020
comment
Спасибо за ответ. - person Borut Flis; 24.12.2020

С on=copy_time я получил следующий вывод.

a = df.resample('1min',on='copy_time').apply(lambda x: sum(x.rand_val) if len(x)>1 else 0)
print (a)

resample ищет объект который должен иметь индекс, подобный дате и времени. В вашем примере я этого не увидел. Передача copy_time даст этот ряд данных для обработки.

             org_time  rand_val  new_val           copy_time
0 2020-10-15 00:00:00         7       26 2020-10-15 00:00:00
1 2020-10-15 00:00:10         8       29 2020-10-15 00:00:10
2 2020-10-15 00:00:20         1       53 2020-10-15 00:00:20
3 2020-10-15 00:03:50         6       69 2020-10-15 00:03:50
4 2020-10-15 00:04:00         3       19 2020-10-15 00:04:00


copy_time
2020-10-15 00:00:00    16
2020-10-15 00:01:00     0
2020-10-15 00:02:00     0
2020-10-15 00:03:00     0
2020-10-15 00:04:00     0
Freq: T, dtype: int64
person Joe Ferndz    schedule 23.12.2020
comment
Мой индекс относится к объекту datetime. По умолчанию он выполняет пониженную выборку индекса. - person Borut Flis; 24.12.2020