Pool raw plug values across wells in one call¶
You need a single long-form DataFrame of plug values + grouping columns, pooled across every well, so you can compute pooled percentiles, build diagnostic plots, or merge with external metadata. No per-well loop.
The minimal pattern¶
df = manager.PHIE.filter("Facies").data(weighted=True)
Result columns:
well |
DEPT |
PHIE |
Facies |
Weight |
|---|---|---|---|---|
Well_A |
2500.0 |
0.193 |
Clean |
0.25 |
Well_A |
2500.5 |
0.062 |
Medium |
0.50 |
… |
… |
… |
… |
… |
well— original well name (not the sanitized key).DEPT— depth.PHIE— the property values; uses your label strings if you setProperty.labels.Facies— one column per active filter, named after the filter property (noGroup1/Group2).Weight— depth-interval weight per row, present whenweighted=True. Use it for depth-weighted percentiles externally:np.average(df["PHIE"], weights=df["Weight"]).
Wells lacking the property are silently skipped (with a warning). Pass
warn_missing=False to silence the warning in scripted use.
Multiple properties at once¶
df = manager.properties(["PHIE", "PERM"]).filter("Facies").data()
Yields one column per property plus the filter columns; depths are joined per well so the result is one row per (well, depth).
Built-in summary¶
The same long-form data is available aggregated:
manager.PHIE.filter("Facies").stats(
return_df=True,
flat_columns=True, # Facies column instead of "Group"
methods=["mean", "percentile_50", "percentile_90"],
)
Verifying¶
story_tests/story_3_pooled_data.pyshows the basic shape.story_tests/story_6_pooled_extraction.pywalks three real use cases — pooled percentile table, suspect-plug diagnostic subset, and cross-check against the library aggregation.