使用scipy.stats来适合xarray DataArray

时间:2018-07-27 21:19:15

标签: python scipy dask python-xarray

我想计算在xarray.DataArray的时间维度上拟合的统计分布的参数。

我想创建一个执行类似以下操作的函数:

from scipy import stats
import xarray as xr

def fit(arr):
    return xr.apply_ufunc(stats.norm.fit, arr, ...)

返回一个新的DataArray,该数据存储存储在时间维度上计算的分布的两个参数。因此,如果输入具有维度(时间,纬度,经度),fit将返回具有维度(参数,纬度,经度)的DataArray。下一步是使用这些参数来计算各种百分位数(例如stats.norm.ppf)。

在多次失败的尝试之后,我怀疑apply_ufunc是否支持该用例,而宁愿使用

进行计算
params = np.apply_along_axis(stats.norm.fit, arr.get_axis_num('time'), arr.data)

然后手动创建DataArray,复制维度和属性。

有什么想法吗?有建议吗?


这是我最终要做的,感觉有点像hack:

# Fit the parameters (lazy computation)
data = dask.array.apply_along_axis(dc.fit, arr.get_axis_num('time'), arr)

# Create a DataArray with the desired dimensions to copy them over to the parameter array.
mean = arr.mean(dim='time', keep_attrs=True)
coords = dict(mean.coords.items())
coords['dparams'] = ([] if dc.shapes is None else dc.shapes.split(',')) + ['loc', 'scale']
out = xr.DataArray(data=data, coords=coords, dims=(u'dparams',) + mean.dims)
out.attrs = arr.attrs

1 个答案:

答案 0 :(得分:1)

Dask数组包含apply_along_axis的类似物,可能是最明显的起点。请注意,具有数组设置的xarray的每个变量都会自动在.data属性中封装一个dask数组。您甚至可以直接传递xarray变量。