Отобразить циклические временные ряды xarray-координаты в массив dask временных рядов 1D - PullRequest
0 голосов
/ 05 ноября 2019

Short:

Возможно ли создать набор данных xarray с 2 различными (временными) координатами, где одна содержит полную информацию о времени для одномерного временного ряда (сохраненного в виде массива dask), а другая -представляет циклический характер данных (повторяющаяся информация о времени)?

Предпосылки и более детальная формулировка:

Предположим, у меня есть эксперимент по измерению, в котором циклический процесс выполняется в течение 1 часа. Один цикл длится около (!) 5 секунд (+/- 0,05 с). Датчики измеряют данные с определенной частотой дискретизации, скажем, 1 кГц.

Что уже отлично работает:

  1. данные измерений уже инициализированы в одномерном массиве данных на датчик
from datetime import datetime, timedelta
import dask.array as da
import xarray

channel_1 = da.random.random(3600000, chunks=5000)
channel_2 = da.random.random(3600000, chunks=5000)
У меня есть чистая координата даты и времени xarray, которая представляет время эксперимента в 1 час с 1000 значениями в секунду
base = datetime(2019,11,5,11)
exp_time = xarray.Coordinate("ExpTime_Dim", [base + timedelta(milliseconds=x) for x in range(3600000)])
У меня есть индексы для начала каждого цикла
  • , поэтому у меня есть каждый сегмент цикла (~ 5000 выборок), 720 циклов через 1 час
  • циклы не имеют абсолютно одинаковыедлины (но все они около 5000 значений, +/- 50 выборок)
  • Я создал временной массив (координата xarray) с максимальной продолжительностью одного цикла (5050 выборок):
base_cycle = timedelta()
cycle_time = xarray.Coordinate("CycleTime_Dim", [base_cycle + timedelta(milliseconds=x) for x in range(5050)])

cycles = xarray.Coordinate("Cycles_Dim", [x for x in range(1, 721)])

(в цикле, в идеале, все оставшиеся образцы до 5050 заполняются NaN)

Фактическая цель

Теперь я хочу создать набор данных xarray сразличные координаты таким образом, что:

  1. У меня есть одна 1D-переменная данных на канал (= датчик измерял что-то)
  2. каждая переменная / DataArray должны совместно использовать один и тот же массив координат exp_time
  3. Одна координата цикла должна работать от 0 до 720 (циклов)
  4. Каждый сегмент цикла (~ 5000 выборок) переменной 1D-данных должен иметь общий массив координат цикла_ времени

Как я могу создатьтакой набор данных xarray?

В качестве сумматора у меня есть

  • наборов данных dask channel_1 и channel_2 , каждая длиной около 60 с * 60 мин * 1000 выборок = 360000 значений
  • координата xarray exp_time , с такой же длиной, что и один набор данных выше
  • координата xarray cycle_time , представляющая один (макс.) цикл с 5050 выборками
  • координата xarray циклов , представляющая циклы от 1 до 720

, что в основном

ds = xarray.Dataset({'channel1': ('ExpTime_Dim', channel_1),
                     'channel2': ('ExpTime_Dim', channel_2)},
                     coords={'Experiment_Time': exp_time,
                             'Cycle_Time': cycle_time,
                             'Cycle': cycles})

Но, конечно, вышеупомянутый набор данных не имеет "связи" или сопоставления с определенными сегментами 1D DataArrays.

Есть ли у кого-нибудь предложения?

Поможет ли мне здесь MultiIndices ?
Я вынужден (не) укладывать циклы из массива 1D в массив 2D (720x5050)?
Как можноЯ получаю доступ к двумерному массиву как к массиву 1D, встроенному в xarray?

Спасибо большое, очень большое!

...