Как я должен построить этот возврат json из pandas dataframe - PullRequest
0 голосов
/ 20 июня 2019

У меня есть некоторые данные, упорядоченные по дате, в виде datetime index .Затем я задаю его так, чтобы оно было нерегулярным:

date_rng = pd.date_range(start='1/1/2018', end='1/8/2018', freq='H')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0,100,size=(len(date_rng)))
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date', drop=True)
df = df[df['data'] > 75]

В моем сервисе (это не для интерактивного использования) мне дают строку, которую я передаю pandas.resample, чтобы агрегировать мои данные времени на любом уровне.Строка передается непосредственно в аргумент rule и может иметь значения типа 'H', '3T', 'Q', 'M'

Я хотел бы использовать эту же строку для создания jsonкоторая похожа на следующую структуру:

{'my_aggregate_level_1': {'2018-01-01 03:00:00', '2018-01-01 07:00:00'},
'my_aggregate_level_2':{'2018-01-08 03:00:00'}}

Массив будет 'рваным', т.е. будут присутствовать не все записи, и не все ключи в json будут иметь одинаковую длину массива.

Цели для хорошего решения:

  1. my_aggregate_level - это уровень, установленный тем же строковым параметром, который задан для resample
  2. массива на уровне агрегатавсегда будут необработанные, ежечасные значения даты и времени
  3. В идеале строковый параметр не связан с кучей «правил перевода», таких как «Если 'D', тогда используйте .strftime, как это, но если 'H' использовать это и если 'M' использовать это
  4. 'H' просто вернет один массив, из необработанных значений

Так на практике, если 'D' поставляется:

{'2018-01-01': {'2018-01-01 03:00:00', '2018-01-01 07:00:00'},
'2018-01-08':{'2018-01-08 03:00:00'}}

Обратите внимание, что на дневном уровне есть две клавиши, сЗначения в массиве делятся на правильный день.

Если указано 'M':

{'2018-01': {'2018-01-01 03:00:00', '2018-01-01 07:00:00', '2018-01-08 03:00:00'}}

Обратите внимание, что это означает, что содержимое массива значений в этом примере будет равно 3,так как все 3 даты находятся в одном и том же месяце

Вещи, которые я пробовал / смотрел, которые я не сделал хорошо:

  • Groupers, они выглядят так, как будто онитолько агрегирование, основанное на некоторых правилах.Мне, в частности, необходимо вернуть фактические записи
  • . Технически сработает анализ нового столбца на основе аргумента rule, но это кажется неправильным, поскольку мне придется начинать преобразование каждого rule в strftime илианалогичный.Я еще не нашел функцию, которая принимает ту же строку символов и также не выполняет агрегирование
  • Является ли установка многоиндексных решений для этого?Возможно, но я не уверен, как его заполнить в отношении пункта выше о 'D', 'M' и т. Д.
  • настраиваемый ресэмплер:
def custom_resampler(array_like):
    return array_like

df.resample('W').apply(custom_resampler)

Что не работает.

Я понимаю, может быть, это не решаемо с правилами, приведенными выше, но я, вероятно, недостаточно хорош в pandas, чтобы понять это.

1 Ответ

0 голосов
/ 20 июня 2019

ОБНОВЛЕНИЕ:

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

df.resample('D').apply(custom_resampler).apply(len) > 0

ОРИГИНАЛ:

Я считаю, что я разработал решение.

В частности, я неправильно использовал пользовательские ресэмплеры, и фактически они могут выполнять преобразование json самостоятельно.Мне нужно немного обработать, чтобы получить результат, который мне нужен, но на данный момент это ответ:

def custom_resampler(array_like):
    return array_like.to_json()

df.resample('D').apply(custom_resampler)

Очень рад, что это исправлено / улучшено / улучшено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...