Dask вложил json с неплоскими списками в фрейм данных - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь преобразовать следующий пример, вложенный json в два отдельных кадра данных. У меня более 100 ГБ файлов, поэтому мне нужно остаться с dask или другим распределенным фреймворком.

{
  "unevenlySampledChannels": [
    {
      "channelTypes": [
        "LATITUDE",
        "LONGITUDE"
      ],
      "timestampsMicrosecondsUtc": [
        "1560989094058462",
        "1560989095057674",
        "1560989096074388"
      ],
      "float64Payload": {
        "payload": [
          84,
          34,
          84.5,
          34.6,
          84.54,
          34.6
        ]
      }
    },
    {
      "channelTypes": [
        "gyroscope_x",
        "gyroscope_y",
        "gyroscope_z"
      ],
      "timestampsMicrosecondsUtc": [
        "1560989094058462",
        "1560989095057674",
        "1560989096074388"
      ],
      "float64Payload": {
        "payload": [
          100,
          200,
          300,
          101,
          201,
          301,
          102,
          202,
          302
        ]
      }
    }
  ]
}

Пока я получил частично работающий следующий код:

def flatten(record):
    return {
        'TimeStamp': record["unevenlySampledChannels"][0]["timestampsMicrosecondsUtc"], 
        'Payload': record["unevenlySampledChannels"][0]["float64Payload"]["payload"],
    }

df = db.from_sequence(filenames).map(open).map(json.load).map(flatten).to_dataframe().compute()

Код генерирует следующий фрейм данных:

                                               Timestamp      Payload
0   [1560989094058462,1560989095057674,1560989096074388]      [84, 34, 84.5, 34.6, 84.54, 34.6]
1   [1560989097058462,1560989098057674,1560989099074388]      [84, 34, 84.5, 34.6, 84.54, 34.6]
...

Я хочу, чтобы каждая уникальная метка времени была индексом. Длина списков варьируется в зависимости от файла и между датчиками (GPS и гироскоп, еще несколько записей не показаны), но длина «полезной нагрузки» всегда является целым числом, кратным временной отметке, в зависимости от количества элементов в записи channelTypes .

Timestamp             lat     long
1560989094058462      84       34
1560989095057674      84.5     34.6
1560989096074388      84.54    34.6
1560989097058462      84       34
1560989098057674      84.5     34.6
1560989099074388      84.54    34.6
...
...