两个xarray DataArrays

时间:2017-07-25 19:19:46

标签: python xarray

我正在尝试计算两个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之间的滚动系数,以便每个系数的尺寸为(date,x)。请注意,存在日期维度,因为沿日期轴应用滚动。

我能够整合并且丑陋的方式来完成这个完整的for循环但是想知道是否有办法通过以某种方式在滚动数据集对象上应用reduce函数来完成它。我找不到办法,但我可能会有一种完全不同的方法。

这个问题可以通过应用任意两个数字作为输入的任意函数来推广(在这种情况下是相关函数。

1 个答案:

答案 0 :(得分:1)

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

  1. 实例化为数据集。连接到新dim 上的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

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