2017-11-03 16 views
1

저는 고전적인 xarray 데이터 세트를 가지고 있습니다. 이들은 월별 데이터 (월간 데이터 38 년)입니다.xarray 데이터 세트의 groupby에 대한 quantile 메소드

매월 별개의 값을 계산하는 데 관심이 있습니다. 내가 사용하는 각 달의 평균하려는 경우

<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 문서에 기초하여, 그룹 B에 대한 quantile 작업 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) 

하고 작동을; 물론 이것은 하나의 인덱스 만 있기 때문에 훨씬 간단한 예제이며 실제로 하나의 인덱스에만 reset_index/set_index를 설정하지 않으면 팬더에서 multiindex를 처리 할 수 ​​없다는 오류가 발생합니다.

그럼, 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 메소드를 사용하여 각 그룹에 임의의 감소 함수를 적용 할 수 있습니다. 아래 예에서 각 그룹에 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