reading-a-planet / predict.py
thanatchon36's picture
reading-a-planet v0.1.0: data and fitted models
416b3a9 verified
Raw History Blame Contribute Delete
2.1 kB
"""Rapid-intensification probabilities from the exported models (numpy + pandas only, no pickle).
import pandas as pd
from predict import load, predict
models = load("models.json")
fixes = pd.read_csv("points.csv.gz", keep_default_na=False, na_values=[""]) # from the HF dataset
p = predict(models["part2_M1c_EP"], fixes[fixes.basin == "EP"])
Each input row is one best-track fix; the columns needed are listed in each model's "features" entry and are
the columns of the dataset's points.csv.gz. The output is the calibrated probability that the 24-h intensity
change starting at that fix is at least 30 kt (RI30).
"""
import json
import numpy as np
import pandas as pd
MISSING_FLAGS = ["dV6", "dV12", "speed_kmh", "u_kmh", "v_kmh", "poleward_kmh"]
BASINS = ["NA", "EP", "WP", "NI", "SI", "SP"]
def load(path="models.json"):
return json.load(open(path))["models"]
def design(df, features, basin_dummies=False):
X = df[features].astype(float).copy()
for c in MISSING_FLAGS:
if c in X:
X[c + "_na"] = X[c].isna().astype(float)
X[c] = X[c].fillna(0.0)
X["V2"] = X.V ** 2
X["dist_land_km"] = np.log1p(X.dist_land_km)
X["age_h"] = np.log1p(X.age_h)
if basin_dummies:
for b in BASINS[1:]:
X["b_" + b] = (df.basin == b).astype(float)
return X
def predict(model, df, calibrated=True):
X = design(df, model["features"], model["basin_dummies"])
assert list(X.columns) == model["columns"], "column order differs from the fitted model"
Z = (X.values - np.array(model["scaler_mean"])) / np.array(model["scaler_scale"])
p = 1.0 / (1.0 + np.exp(-(Z @ np.array(model["coef"]) + model["intercept"])))
if not calibrated:
return p
iso = model["isotonic"]
if "per_basin" in iso: # pooled model: one calibration curve per basin
out = np.empty(len(df))
for b, curve in iso["per_basin"].items():
k = (df.basin == b).values
out[k] = np.interp(p[k], curve["x"], curve["y"])
return out
return np.interp(p, iso["x"], iso["y"])