1

我正在尝试计算两个 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)。请注意,存在日期维度是因为滚动是沿日期轴应用的。

我能够以一种丑陋的方式来完成这个充满 for 循环的工作,但我想知道是否有办法通过在滚动数据集对象上应用 reduce 函数来做到这一点。我看不到这样做的方法,但我可能缺少一种完全不同的方法。

这个问题可以通过应用任意函数来概括,该函数将两个数字序列作为输入(在本例中为相关函数。

4

1 回答 1

2

可以使用 构造一个新的滚动窗口维度DatasetRolling.construct,然后使用 计算窗口暗淡的相关性xarray.corr

  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

一个非常陈旧的线程,是的,但希望这可以帮助某人。

于 2021-02-28T01:52:28.530 回答