Multi-Well Analysis¶
WellDataManager¶
WellDataManager is the central orchestrator for multi-well workflows:
from logsuite import WellDataManager
manager = WellDataManager()
manager.load_las("well_a.las")
manager.load_las("well_b.las")
manager.load_las("well_c.las")
Accessing Wells¶
# By sanitized attribute name
well = manager.well_12_3_2_B
# List all wells
print(manager.wells) # ['12/3-2 B', '12/3-2 A', ...] — original names
# Iterate Well objects
for well in manager:
print(well.name)
Filtered views¶
manager.filter(wells=[...], where={...}) returns an immutable
ManagerView exposing the same property/well attribute access as the
manager but restricted to a subset:
view = manager.filter(wells=["Well_A", "Well_B"])
view.PHIE.mean() # only over the two wells
sub = manager.filter(where={"Facies": "Reservoir"})
sub.PHIE.data() # only Reservoir-facies rows
ManagerView is the canonical input to Crossplot(view, x=, y=) —
visualization consumers read from a manager substrate rather than a
list of Wells.
Broadcasting¶
Access properties across all wells simultaneously:
# Mean porosity per well
means = manager.PHIE.mean()
# {'well_A': 0.185, 'well_B': 0.192, ...}
# Filtered statistics across all wells
stats = manager.PHIE.filter('Zone').sums_avg()
# {'well_A': {'Reservoir': {...}, 'NonReservoir': {...}}, ...}
Data Validation¶
Check data integrity across all wells:
issues = manager.validate()
# {'well_B': ['Missing property: SW', ...]}
Skipped Well Warnings¶
When a property doesn’t exist in some wells, the manager warns:
import warnings
warnings.simplefilter("always")
# If well_C lacks PHIE, you'll see:
# UserWarning: Skipped 1 well(s) without property 'PHIE': well_C
means = manager.PHIE.mean()