Я пытаюсь вычислить корреляцию между двумя наборами данных в xarray по измерению времени. Мой набор данных оба широте, долготе и времени. В одном из моих наборов данных пропущено достаточно данных, поэтому нет смысла интерполировать и устранять пробелы, вместо этого я хотел бы просто игнорировать пропущенные значения. У меня есть несколько простых кусков кода, которые работают несколько, но ни один из них не подходит для моего точного использования. Например:
def covariance(x,y,dims=None):
return xr.dot(x-x.mean(dims), y-y.mean(dims), dims=dims) / x.count(dims)
def correlation(x,y,dims=None):
return covariance(x,y,dims) / (x.std(dims) * y.std(dims))
работает хорошо, если нет данных, но, конечно, не может работать с nans. Хотя здесь есть хороший пример , написанный для xarray , даже с этим кодом я изо всех сил пытаюсь вычислить корреляцию Пирсона, а не копьеносца.
import numpy as np
import xarray as xr
import bottleneck
def covariance_gufunc(x, y):
return ((x - x.mean(axis=-1, keepdims=True))
* (y - y.mean(axis=-1, keepdims=True))).mean(axis=-1)
def pearson_correlation_gufunc(x, y):
return covariance_gufunc(x, y) / (x.std(axis=-1) * y.std(axis=-1))
def spearman_correlation_gufunc(x, y):
x_ranks = bottleneck.rankdata(x, axis=-1)
y_ranks = bottleneck.rankdata(y, axis=-1)
return pearson_correlation_gufunc(x_ranks, y_ranks)
def spearman_correlation(x, y, dim):
return xr.apply_ufunc(
spearman_correlation_gufunc, x, y,
input_core_dims=[[dim], [dim]],
dask='parallelized',
output_dtypes=[float])
Наконец было полезнымобсуждение на github добавления этого в качестве функции к xarray, но это еще не реализовано. Есть ли эффективный способ сделать это для наборов данных с пробелами в данных?