Скользящие коэффициенты корреляции для двух 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 ответ
Можно построить новое измерение скользящего окна, используя, затем рассчитайте корреляцию по тусклости окна, используя:
- Создать как набор данных. Объединение в 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
- Создайте объект скользящего окна, используя
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
- Вызов
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
Да, очень устаревшая тема, но, надеюсь, это кому-то поможет.