Скользящие коэффициенты корреляции для двух xarray DataArrays

Я пытаюсь вычислить скользящую корреляцию между двумя массивами данных xarray.

Предположим, мой набор данных:

<xarray.Dataset>
Dimensions:            (date: 2621, x: 100)
Coordinates:
  * date               (date) datetime64[ns] 2007-01-03 2007-01-04 ...
  * x                  (x) int64 1 2 3 4 5 6 ...
Data variables:
    a                  (date) float64 -0.001011 0.001227 -0.006087 0.002535 ...
    b                  (date, x) float64 -0.001007 -0.0001312 -0.02594 ...

Я хотел бы вычислить коэффициенты прокатки между a и b так, чтобы размеры каждого коэффициента были (дата, x). Обратите внимание, что измерение даты присутствует, потому что переход применяется по оси даты.

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

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

1 ответ

Можно построить новое измерение скользящего окна, используя, затем рассчитайте корреляцию по тусклости окна, используя:

  1. Создать как набор данных. Объединение в DataArray на новом измерении также будет работать.
      import xarray as xr
ds = xr.Dataset({
    'series1': xr.DataArray(np.arange(10), dims='x'),
    'series2': xr.DataArray(np.arange(10, 20), dims='x')
})
ds
# <xarray.Dataset>
# Dimensions:  (x: 10)
# Dimensions without coordinates: x
# Data variables:
#     series1  (x) int64 0 1 2 3 4 5 6 7 8 9
#     series2  (x) int64 10 11 12 13 14 15 16 17 18 19
  1. Создайте объект скользящего окна, используяDataset.rolling, и создайте новое измерение окна на этом объекте, используяDatasetRolling.construct:
      rolling = ds.rolling(x=3)
with_dim = rolling.construct('window_dim')
with_dim
# <xarray.Dataset>
# Dimensions:  (window_dim: 3, x: 10)
# Dimensions without coordinates: window_dim, x
# Data variables:
#     series1  (x, window_dim) float64 nan nan 0.0 nan 0.0 ... 7.0 8.0 7.0 8.0 9.0
#     series2  (x, window_dim) float64 nan nan 10.0 nan ... 18.0 17.0 18.0 19.0
  1. Вызовxarray.corrпо-прежнему:
      xr.corr(with_dim['series1'], with_dim['series2'], dim='window_dim')
# <xarray.DataArray (x: 10)>
# array([nan,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
# Dimensions without coordinates: x

Да, очень устаревшая тема, но, надеюсь, это кому-то поможет.

Другие вопросы по тегам