Рассчитать корреляцию в xarray с отсутствующими данными - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь вычислить корреляцию между двумя наборами данных в 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, но это еще не реализовано. Есть ли эффективный способ сделать это для наборов данных с пробелами в данных?

...