Pandas resample () Series с неверными индексами - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь скопировать многолетний временной ряд дат и значений с плавающей запятой.Я пытаюсь объединять каждый день в 15-минутные корзины.Поэтому я группирую набор данных по дням, а затем повторяю выборку с 15-минутными приращениями в каждый день.

Результаты казались странными, поэтому я более внимательно посмотрел на поведение повторной выборки.Приведенный ниже код суммирует вид результатов, которые я наблюдал (я запускаю его в repl.it)

aindex = pd.to_datetime([
"2013-04-05 04:15:31",
"2013-04-05 05:15:18",
"2013-04-05 05:15:19",
"2013-04-05 05:15:19",
"2013-04-05 05:17:15",
"2013-04-05 07:06:31",
"2013-04-09 04:15:31",
"2013-04-09 05:15:18",
"2013-04-09 05:15:19",
"2013-04-09 05:15:19",
"2013-04-09 05:17:15",
"2013-04-09 07:06:31",
"2013-04-09 07:21:28",
"2013-04-09 09:18:19",
"2013-04-09 09:19:19",
"2013-04-09 09:21:31"])
a = pd.Series([-4.50e+08,
-4.80e+08,
-6.10e+08,
-5.80e+08,
-5.70e+08,
-5.710e+08,
-4.598432e+08,
-4.814140e+08,
-6.109284e+08,
-5.870819e+08,
-5.759888e+08,
-5.713363e+08,
-5.275122e+07,
-2.853787e+08,
-2.523782e+08,
-4.273267e+08],aindex)
print(a)
print(a.groupby(a.index).apply(lambda x: x))
print(a.resample("15T", base=0).apply(lambda x: x))
print(a.groupby(a.index).resample("15T").apply(lambda x: x))

'groupby' ведет себя, как и ожидалось, но обратите внимание, что каждое значение 'x' имеет тип pd.Series.'resample' также возвращает тип pd.Series, но, по-видимому, пропускает значения, когда я отображаю его в repl.it или Jupyter, но если вы измените .apply (lambda x: x) на .apply (lambda x: list (x)), вы можетевидите, на самом деле есть несколько значений.'groupby' + 'resample' почти делает то, что я ожидал, т.е.каждый день имеет 15-минутные интервалы, за исключением того, что индексация неверна везде, где «повторная выборка» возвращает более одного значения.

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

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

2013-04-05 04:15:00   -450000000.0
2013-04-05 04:30:00            NaN
2013-04-05 04:45:00            NaN
2013-04-05 05:00:00            NaN
2013-04-05 05:15:00   -570000000.0
2013-04-05 05:30:00            NaN
2013-04-05 05:45:00            NaN
2013-04-05 06:00:00            NaN
2013-04-05 06:15:00            NaN
2013-04-05 06:30:00            NaN
2013-04-05 06:45:00            NaN
2013-04-05 07:00:00   -571000000.0
2013-04-05 07:15:00            NaN
2013-04-05 07:30:00            NaN
2013-04-05 07:45:00            NaN
2013-04-05 08:00:00            NaN
2013-04-05 08:15:00            NaN
2013-04-05 08:30:00            NaN
2013-04-05 08:45:00            NaN
2013-04-05 09:00:00            NaN
2013-04-05 09:15:00            NaN
2013-04-05 09:30:00            NaN
2013-04-05 09:45:00            NaN
2013-04-05 10:00:00            NaN

Но если групповой сбор выполняется первым, я не получаю пустые ячейки.Почему бы и нет?

1014 *

1 Ответ

1 голос
/ 10 июля 2019

Resample - сложная функция. Основная проблема с передискретизацией заключается в том, что вам нужно выбрать, какое значение вы хотите сохранить (используя pandas.DataFrame.last или pandas.DataFrame.first).

Таким образом:

> a.resample("15T", base=0).last()

2013-04-05 04:15:00   -450000000.0
2013-04-05 04:30:00            NaN
2013-04-05 04:45:00            NaN
2013-04-05 05:00:00            NaN
2013-04-05 05:15:00   -570000000.0

устранит необходимость использования .apply(lambda x: x), так как он сохранит этот последний элемент в образце.

pandas.DataFrame повторная выборка уже использует mean по умолчанию.

Чтобы иметь эквивалент с groupby, вам нужно будет сделать это безопаснее для группировки, а затем применить среднее значение, чтобы мы могли интерполировать значение для интервала

> a.groupby(a.index).mean().resample("15T", base=0).last()


2013-04-05 04:15:00   -450000000.0
2013-04-05 04:30:00            NaN
2013-04-05 04:45:00            NaN
2013-04-05 05:00:00            NaN
2013-04-05 05:15:00   -570000000.0

Надеюсь, правильно понял ваш вопрос. Дайте мне знать, если это поможет.

Редактировать

Вы можете попытаться сохранить все индексы, используя:

> a.resample('15T').asfreq()    

Но вы получите: ValueError: cannot reindex from a duplicate axis.

Это основная проблема, что индексы в пандах не могут быть дублированы. Вот почему groupby со средним значением работает, поскольку оно группирует элементы в группы по одному элементу, а затем выполняет повторную выборку для этой группы.

Один из способов сделать это без groupby - использовать мультииндексные фреймы данных:

> a.to_frame().set_index([a.index, a.index.round('15T')])

                                                   0
2013-04-05 04:15:31 2013-04-05 04:15:00 -450000000.0
2013-04-05 05:15:18 2013-04-05 05:15:00 -480000000.0
2013-04-05 05:15:19 2013-04-05 05:15:00 -610000000.0
                    2013-04-05 05:15:00 -580000000.0
2013-04-05 05:17:15 2013-04-05 05:15:00 -570000000.0
2013-04-05 07:06:31 2013-04-05 07:00:00 -571000000.0
2013-04-09 04:15:31 2013-04-09 04:15:00 -459843200.0
2013-04-09 05:15:18 2013-04-09 05:15:00 -481414000.0
2013-04-09 05:15:19 2013-04-09 05:15:00 -610928400.0
                    2013-04-09 05:15:00 -587081900.0
2013-04-09 05:17:15 2013-04-09 05:15:00 -575988800.0
2013-04-09 07:06:31 2013-04-09 07:00:00 -571336300.0
2013-04-09 07:21:28 2013-04-09 07:15:00  -52751220.0
2013-04-09 09:18:19 2013-04-09 09:15:00 -285378700.0
2013-04-09 09:19:19 2013-04-09 09:15:00 -252378200.0
2013-04-09 09:21:31 2013-04-09 09:15:00 -427326700.0

Или, изменяя порядок индекса для группировки по округленному индексу:

> a.to_frame().set_index([a.index.round('15T'), a.index])


2013-04-05 04:15:00 2013-04-05 04:15:31 -450000000.0
2013-04-05 05:15:00 2013-04-05 05:15:18 -480000000.0
                    2013-04-05 05:15:19 -610000000.0
                    2013-04-05 05:15:19 -580000000.0
                    2013-04-05 05:17:15 -570000000.0
2013-04-05 07:00:00 2013-04-05 07:06:31 -571000000.0
2013-04-09 04:15:00 2013-04-09 04:15:31 -459843200.0
2013-04-09 05:15:00 2013-04-09 05:15:18 -481414000.0
                    2013-04-09 05:15:19 -610928400.0
                    2013-04-09 05:15:19 -587081900.0
                    2013-04-09 05:17:15 -575988800.0
2013-04-09 07:00:00 2013-04-09 07:06:31 -571336300.0
2013-04-09 07:15:00 2013-04-09 07:21:28  -52751220.0
2013-04-09 09:15:00 2013-04-09 09:18:19 -285378700.0
                    2013-04-09 09:19:19 -252378200.0
                    2013-04-09 09:21:31 -427326700.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...