用xarray滚动分位数

问题描述 投票:0回答:1

xArray窗口上有DataArray.rolling计算分位数的方法吗?列出的可用方法包括meanmedian,但在分位数/百分位数上没有任何内容。我想知道这是否可以某种方式完成,即使没有直接的方法。

目前,我在本地将xArray数据迁移到pandas.DataFrame,在那里我应用rolling().quantile()序列。在那之后,我采取新的DataFrame的价值并从中建立一个xArray.DataArray。可重现的代码:

import xarray as xr
import pandas as pd
import numpy as np

times = np.arange(0, 30)
locs = ['A', 'B', 'C', 'D'] 

signal = xr.DataArray(np.random.rand(len(times), len(locs)), 
                      coords=[times, locs], dims=['time', 'locations'])
window = 5

df = pd.DataFrame(data=signal.data)
roll = df.rolling(window=window, center=True, axis=0).quantile(.25).dropna()
window_array = xr.DataArray(roll.values, 
            coords=[np.arange(0, signal.time.shape[0] - window + 1), signal.locations], 
            dims=['time', 'locations'])

任何有关尽可能坚持xArray的线索都是受欢迎的。

让我们考虑同样的问题,只是尺寸较小(10个时间实例,2个位置)。

这是第一种方法的输入(通过pandas):

<xarray.DataArray (time: 8, locations: 2)>
array([[0.404362, 0.076203],
       [0.353639, 0.076203],
       [0.387167, 0.102917],
       [0.525404, 0.298231],
       [0.755646, 0.298231],
       [0.460749, 0.414935],
       [0.104887, 0.498813],
       [0.104887, 0.420935]])
Coordinates:
* time       (time) int32 0 1 2 3 4 5 6 7
* locations  (locations) <U1 'A' 'B'

请注意,由于在滚动对象上调用dropna(),'time'维度较小。新的尺寸大小基本上是len(times) - window + 1。现在,提出的方法的输出(通过construct):

<xarray.DataArray (time: 10, locations: 2)>
array([[0.438426, 0.127881],
       [0.404362, 0.076203],
       [0.353639, 0.076203],
       [0.387167, 0.102917],
       [0.525404, 0.298231],
       [0.755646, 0.298231],
       [0.460749, 0.414935],
       [0.104887, 0.498813],
       [0.104887, 0.420935],
       [0.112651, 0.60338 ]])
Coordinates:
* time       (time) int32 0 1 2 3 4 5 6 7 8 9
* locations  (locations) <U1 'A' 'B'

似乎尺寸仍然是(time, locations),前者的大小等于10,而不是8.在这里的例子中,自center=True以来,如果你删除第二个数组中的第一行和最后一行,两个结果是相同的。不应该DataArray有一个新的维度,tmp

此外,这种方法(安装了bottleneck)比通过pandas最初提出的方法更多。例如,在1000 times x 2 locations的案例研究中,pandas运行需要0.015秒,而construct运行需要1.25秒。

python quantile python-xarray
1个回答
4
投票

您可以使用滚动对象的construct method,它会生成具有滚动尺寸的新DataArray

signal.rolling(time=window, center=True).construct('tmp').quantile(.25, dim='tmp')

在上面,我构建了一个带有额外tmp维度的DataArray,并沿此维度计算分位数。

© www.soinside.com 2019 - 2024. All rights reserved.