Upload model/inference.py with huggingface_hub
Browse files- model/inference.py +35 -0
model/inference.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import joblib, numpy as np
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
|
| 5 |
+
def load_globalwellfm(model_dir="GlobalWellFM_v1"):
|
| 6 |
+
p = Path(model_dir)
|
| 7 |
+
model = joblib.load(p / "xgb_model.joblib")
|
| 8 |
+
imputer = joblib.load(p / "imputer.joblib")
|
| 9 |
+
le = joblib.load(p / "label_encoder.joblib")
|
| 10 |
+
return model, imputer, le
|
| 11 |
+
|
| 12 |
+
def predict_lithofacies(df, model_dir="GlobalWellFM_v1"):
|
| 13 |
+
"""df: DataFrame with columns GR, RHOB, NPHI, RT (ohm.m)"""
|
| 14 |
+
model, imputer, le = load_globalwellfm(model_dir)
|
| 15 |
+
f = df.copy()
|
| 16 |
+
f["GR_N"] = f["GR"].clip(0,200)/200
|
| 17 |
+
f["RHOB_N"] = (f["RHOB"].clip(1.5,3.0)-1.5)/1.5
|
| 18 |
+
f["NPHI_N"] = f["NPHI"].clip(-0.1,0.6)
|
| 19 |
+
f["RT_LOG"] = np.log10(f["RT"].clip(0.01,10000))
|
| 20 |
+
f["VCL"] = ((f["GR"].clip(0,200)-30)/(120-30)).clip(0,1)
|
| 21 |
+
f["PHI_D"] = ((2.65-f["RHOB"])/(2.65-1.0)).clip(0,0.45)
|
| 22 |
+
f["PHI_N"] = f["NPHI"].clip(0,0.45)
|
| 23 |
+
f["PHI_AVG"]= (f["PHI_D"]+f["PHI_N"])/2
|
| 24 |
+
f["PHI_EFF"]= (f["PHI_AVG"]*(1-f["VCL"])).clip(0,0.45)
|
| 25 |
+
f["NPHI_RHOB_DIFF"] = f["NPHI_N"]-f["RHOB_N"]
|
| 26 |
+
f["GR_RT_RATIO"] = f["GR_N"]/(f["RT_LOG"]+2)
|
| 27 |
+
import warnings; warnings.filterwarnings("ignore")
|
| 28 |
+
Ro = 0.05/np.power(np.where(f["PHI_EFF"]>0,f["PHI_EFF"],np.nan),2)
|
| 29 |
+
f["SW"] = np.clip(np.sqrt(Ro/f["RT"].clip(0.01)),0,1)
|
| 30 |
+
FCOLS = ["GR_N","RHOB_N","NPHI_N","RT_LOG","VCL","PHI_D","PHI_N","PHI_AVG","PHI_EFF","NPHI_RHOB_DIFF","GR_RT_RATIO","SW"]
|
| 31 |
+
X = imputer.transform(f[FCOLS].values)
|
| 32 |
+
probs = model.predict_proba(X)
|
| 33 |
+
preds = le.inverse_transform(model.predict(X))
|
| 34 |
+
conf = probs.max(axis=1)
|
| 35 |
+
return preds, conf
|