#python #geospatial #correlation #netcdf #python-xarray
Вопрос:
Я хотел бы рассчитать ранговую корреляцию Спирмена между двумя наборами данных о осадках (файлы netcdf, открытые с помощью xarray) по области Африки с течением времени для каждого сезона и построить пространственные корреляции. Я обнаружил, что следующие функции работают, но вычисленная корреляция-это корреляция Пирсона, и я хотел бы получить корреляцию Спирмена.
def covariance(x, y, dims=None):
return xr.dot(x - x.mean(dims), y - y.mean(dims), dims=dims) / x.count(dims)
def corrrelation(x, y, dims=None):
return covariance(x, y, dims) / (x.std(dims) * y.std(dims))
ds2_djf_cor = corrrelation(da2_sum_season.sel(time=da2_sum_season.time.dt.month.isin([12])),
da1_sum_season.sel(time=da1_sum_season.time.dt.month.isin([12])), dims='time')
Кто-нибудь знает, как я мог бы это сделать, либо настроив вышеуказанные функции, либо начав с нуля?
Вот как выглядят данные (они были пересчитаны для получения сезонных итогов): da1_sum_season
<xarray.DataArray 'pre' (time: 148, lat: 162, lon: 162)>
array([[[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
...,
[ nan, nan, nan, ..., 137.2 ,
142.3 , 143.9 ],
[ nan, nan, nan, ..., 143.7 ,
148.5 , 147.2 ],
[ nan, nan, nan, ..., 146.1 ,
150.2 , 154.70001 ]],
[[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
...
[ nan, nan, nan, ..., 26.900002 ,
26.400002 , 21.900002 ],
[ nan, nan, nan, ..., 33.2 ,
28.2 , 26.7 ],
[ nan, nan, nan, ..., 31. ,
31.400002 , 25.800001 ]],
[[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
...,
[ nan, nan, nan, ..., 35. ,
33.600002 , 37.5 ],
[ nan, nan, nan, ..., 36.6 ,
37.4 , 35.5 ],
[ nan, nan, nan, ..., 36. ,
36.2 , 34.4 ]]], dtype=float32)
Coordinates:
* time (time) datetime64[ns] 1981-03-01 1981-06-01 ... 2017-12-01
* lon (lon) float64 -20.25 -19.75 -19.25 -18.75 ... 59.25 59.75 60.25
* lat (lat) float64 -40.25 -39.75 -39.25 -38.75 ... 39.25 39.75 40.25
da2_sum_season
<xarray.DataArray 'precip' (time: 148, lat: 162, lon: 162)>
array([[[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
...,
[ nan, nan, nan, ..., 117.96996 ,
137.49915 , 149.82387 ],
[ nan, nan, nan, ..., 102.017044 ,
128.21773 , 149.24342 ],
[ nan, nan, nan, ..., 115.326996 ,
114.31691 , 124.208435 ]],
[[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
...
[ nan, nan, nan, ..., 17.362268 ,
17.088856 , 15.534197 ],
[ nan, nan, nan, ..., 20.717667 ,
18.122211 , 16.771612 ],
[ nan, nan, nan, ..., 20.810205 ,
20.894186 , 19.719692 ]],
[[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
nan, nan],
...,
[ nan, nan, nan, ..., 30.264874 ,
29.965853 , 29.489614 ],
[ nan, nan, nan, ..., 31.865303 ,
30.22337 , 29.885433 ],
[ nan, nan, nan, ..., 29.05289 ,
31.94003 , 29.72091 ]]], dtype=float32)
Coordinates:
* time (time) datetime64[ns] 1981-03-01 1981-06-01 ... 2017-12-01
* lon (lon) float64 -20.25 -19.75 -19.25 -18.75 ... 59.25 59.75 60.25
* lat (lat) float64 -40.25 -39.75 -39.25 -38.75 ... 39.25 39.75 40.25
Комментарии:
1. Я отмечаю, что вы хотели сделать это «с нуля», однако
xskillscore
в пакете есть такая функция: xskillscore.readthedocs.io/en/stable/api/…2. @RobertDavy большое вам спасибо, это то, что я искал. Я только предлагал «начать с нуля», если не было альтернативы/по необходимости.
3. @RobertDavy извините за другой вопрос, при использовании xskillscore_spearman_r на выходе появляются большие белые пятна (т. е. Отсутствуют). Вы знаете, что могло бы стать причиной этого? Невозможно, чтобы в исходном наборе данных было так много недостающих данных. Я думаю, что это связано со связанными рангами. Как эта операция относится к связанным рангам?
4. Возможно, лучше всего поднять вопрос на их github, если вы считаете, что он существует. Если вы углубитесь в код, он выполнит корреляцию Спирмена, вызывая
bottleneck.nanrankdata
каждый временной ряд, а затем выполняя корреляцию Пирсона этих двух. Я полагаю, что если бы у вас были временные ряды всех нулей ( не редкость для precip ?) это может привести к некоторым странным результатам.5. Большое спасибо, я думаю, что проблема заключается во временном ряду нулей.