2017-11-03 8 views
1

私は古典的なxarrayデータセットを持っています。これは毎月のデータ(38年間の月次データ)です。xarrayデータセットのgroupby上の分位法

私は毎月の分位値を別々に計算することに興味があります。例えば

<xarray.Dataset> 
Dimensions:  (lat: 26, lon: 71, time: 456) 
Coordinates: 
    * lat   (lat) float32 25.0 26.0 27.0 28.0 29.0 30.0 31.0 32.0 ... 
    * lon   (lon) float32 -130.0 -129.0 -128.0 -127.0 -126.0 -125.0 ... 
    * time   (time) datetime64[ns] 1979-01-31 1979-02-28 1979-03-31 ... 
Data variables: 
    var1   (time, lat, lon) float32 nan nan nan nan nan nan nan nan ... 
    var2   (time, lat, lon) float32 nan nan nan nan nan nan nan nan ... 
    var3   (time, lat, lon) float32 nan nan nan nan nan nan nan nan ... 
    ...... 

、私が使用し、各月の平均たい場合:

ds.groupby(‘time.month’).mean(dim=‘time’) 

をしかし、私は

ds.groupby(‘time.month’).quantile(0.75, dim=‘time’) 

をしようとした場合、私は、しかし

AttributeError: 'DatasetGroupBy' object has no attribute 'quantile' 

を取得し、 Pandasの文書に基づいて、グループ分けyオブジェクト。

df_ds = xr.Dataset.to_dataframe(ds) 
df_ds = df_ds.reset_index() 
df_ds = df_ds.set_index('time') 
df_ds.groupby(pd.TimeGrouper(freq='M')).quantile(0.75) 

、それが動作します。:

は実際に、私は次のことを試してみましたもちろん、これはもっと簡単な例です。インデックスは1つしかないので、実際にreset_index/set_indexを1つのインデックスに設定しないと、マルチインデックスを処理できないというパンダのエラーが発生します。

だから、xarrayはそれを行うことができますか?おそらくいくつかの適用/ラムダの組み合わせを使用していますか?

私は非常に非エレガントな方法を見つけた。私は4つの変数を持っている(と私は変数名に目を通すこともできますが、私はここではない)ので、それは実現可能である:私は基本的にxarray回避

Data_clim_monthly_75g = ds.where(iok_conus_xarray).groupby('time.month') 
Data_clim_monthly_75 = ds.where(iok_conus_xarray).groupby('time.month').mean(dim='time') 

v1 = Data_clim_monthly_75['var1'].values 
v2 = Data_clim_monthly_75['var2'].values 
v3 = Data_clim_monthly_75['var3'].values 
v4 = Data_clim_monthly_75['var4'].values 
for k, gp in Data_clim_monthly_75g: 
    v1[k-1] = np.nanpercentile(gp['var1'].values,q=75,axis=0) 
    v2[k-1] = np.nanpercentile(gp['var2'].values,q=75,axis=0) 
    v3[k-1] = np.nanpercentile(gp['var3'].values,q=75,axis=0) 
    v4[k-1] = np.nanpercentile(gp['var4'].values,q=75,axis=0) 
Data_clim_monthly_75['var1'] = (('month','lat','lon'),v1)  
Data_clim_monthly_75['var2'] = (('month','lat','lon'),v2)  
Data_clim_monthly_75['var3'] = (('month','lat','lon'),v3)  
Data_clim_monthly_75['var4'] = (('month','lat','lon'),v4)  

。私はまだxarray内の解決策が大好きです。

答えて

1

groupbyオブジェクトにquantileメソッドをまだ追加していません。ただし、reduceメソッドを使用すると、各グループに任意のreduce関数を適用できます。下の私の例では、私はnp.nanpercentileを各グループに適用します。

In [21]: ds 
Out[21]: 
<xarray.Dataset> 
Dimensions: (lat: 71, lon: 26, time: 456) 
Coordinates: 
    * time  (time) datetime64[ns] 1979-01-31 1979-02-28 1979-03-31 ... 
Dimensions without coordinates: lat, lon 
Data variables: 
    var1  (time, lon, lat) float64 0.4286 0.4032 0.2178 0.7652 0.8108 ... 
    var2  (time, lon, lat) float64 0.8259 0.3625 0.6556 0.7403 0.2381 ... 

In [22]: ds.groupby('time.month').reduce(np.nanpercentile, dim='time', q=0.75) 
Out[22]: 
<xarray.Dataset> 
Dimensions: (lat: 71, lon: 26, month: 12) 
Coordinates: 
    * month (month) int64 1 2 3 4 5 6 7 8 9 10 11 12 
Dimensions without coordinates: lat, lon 
Data variables: 
    var1  (month, lon, lat) float64 0.04153 0.03099 0.07881 0.01749 ... 
    var2  (month, lon, lat) float64 0.03518 0.06896 0.01287 0.025 0.01536 ... 
+0

偉大な - 確かに私のソリューションよりも速く働いた。 – claire

関連する問題