← 返回案例详情

RESOURCE PREVIEW

core_model.py

core_model.py / src/core_model.py

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])