DOCUMENT CONTENT
文档内容
"""Case 01 core algorithms: station climate trend diagnostics."""
from __future__ import annotations
import numpy as np
from scipy.stats import kendalltau
def sen_slope(time, values):
t=np.asarray(time,float); y=np.asarray(values,float)
if t.size != y.size or t.size < 2: raise ValueError("time/value length must be >=2")
i,j=np.triu_indices(t.size,1)
valid=np.isfinite(t[i])&np.isfinite(t[j])&np.isfinite(y[i])&np.isfinite(y[j])&(t[j]!=t[i])
if not valid.any(): raise ValueError("at least one distinct finite time pair is required")
return float(np.median((y[j[valid]]-y[i[valid]])/(t[j[valid]]-t[i[valid]])))
def mann_kendall(values):
y=np.asarray(values,float)
tau,p=kendalltau(np.arange(y.size),y,nan_policy="omit")
return {"tau":float(tau),"p_value":float(p)}
def station_trends(years, field):
y=np.asarray(field,float)
return np.array([sen_slope(years,row) for row in y]), np.array([mann_kendall(row)["p_value"] for row in y])