well-log-toolkit 0.1.136__tar.gz → 0.1.138__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/PKG-INFO +40 -1
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/README.md +39 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/pyproject.toml +1 -1
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/manager.py +41 -19
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/property.py +6 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit.egg-info/PKG-INFO +40 -1
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/setup.cfg +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/__init__.py +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/exceptions.py +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/las_file.py +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/operations.py +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/regression.py +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/statistics.py +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/utils.py +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/visualization.py +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit/well.py +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit.egg-info/SOURCES.txt +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit.egg-info/dependency_links.txt +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit.egg-info/requires.txt +0 -0
- {well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: well-log-toolkit
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.138
|
|
4
4
|
Summary: Fast LAS file processing with lazy loading and filtering for well log analysis
|
|
5
5
|
Author-email: Kristian dF Kollsgård <kkollsg@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -1171,6 +1171,45 @@ plot = manager.Crossplot(
|
|
|
1171
1171
|
plot.show()
|
|
1172
1172
|
```
|
|
1173
1173
|
|
|
1174
|
+
#### Multi-Layer Crossplots
|
|
1175
|
+
|
|
1176
|
+
Combine different data types (Core vs Sidewall, different property pairs) in a single plot with automatic shape/color encoding:
|
|
1177
|
+
|
|
1178
|
+
```python
|
|
1179
|
+
# Compare Core and Sidewall data with regression by well
|
|
1180
|
+
plot = manager.Crossplot(
|
|
1181
|
+
layers={
|
|
1182
|
+
"Core": ['CorePor', 'CorePerm'],
|
|
1183
|
+
"Sidewall": ["SidewallPor", "SidewallPerm"]
|
|
1184
|
+
},
|
|
1185
|
+
color="Formation", # Color by formation
|
|
1186
|
+
shape="NetSand", # Shape by net sand flag
|
|
1187
|
+
regression_by_color="exponential-polynomial", # Separate trend per formation
|
|
1188
|
+
y_log=True, # Log scale for permeability
|
|
1189
|
+
title="Core vs Sidewall Analysis"
|
|
1190
|
+
)
|
|
1191
|
+
plot.show()
|
|
1192
|
+
|
|
1193
|
+
# Simpler version - automatic defaults
|
|
1194
|
+
manager.Crossplot(
|
|
1195
|
+
layers={
|
|
1196
|
+
"Core": ['CorePor', 'CorePerm'],
|
|
1197
|
+
"Sidewall": ["SidewallPor", "SidewallPerm"]
|
|
1198
|
+
},
|
|
1199
|
+
y_log=True
|
|
1200
|
+
).show()
|
|
1201
|
+
# Automatically uses shape="label" (different markers per layer)
|
|
1202
|
+
# and color="well" (different colors per well)
|
|
1203
|
+
```
|
|
1204
|
+
|
|
1205
|
+
**How it works:**
|
|
1206
|
+
|
|
1207
|
+
- `layers` dict maps labels to [x, y] property pairs
|
|
1208
|
+
- Each layer gets combined in one plot with unified axes
|
|
1209
|
+
- Shape defaults to `"label"` (Core gets circles, Sidewall gets squares)
|
|
1210
|
+
- Color defaults to `"well"` for multi-well visualization
|
|
1211
|
+
- Perfect for comparing different measurement types (Core plugs vs Formation tests)
|
|
1212
|
+
|
|
1174
1213
|
### Logarithmic Scales
|
|
1175
1214
|
|
|
1176
1215
|
Perfect for permeability and resistivity data:
|
|
@@ -1133,6 +1133,45 @@ plot = manager.Crossplot(
|
|
|
1133
1133
|
plot.show()
|
|
1134
1134
|
```
|
|
1135
1135
|
|
|
1136
|
+
#### Multi-Layer Crossplots
|
|
1137
|
+
|
|
1138
|
+
Combine different data types (Core vs Sidewall, different property pairs) in a single plot with automatic shape/color encoding:
|
|
1139
|
+
|
|
1140
|
+
```python
|
|
1141
|
+
# Compare Core and Sidewall data with regression by well
|
|
1142
|
+
plot = manager.Crossplot(
|
|
1143
|
+
layers={
|
|
1144
|
+
"Core": ['CorePor', 'CorePerm'],
|
|
1145
|
+
"Sidewall": ["SidewallPor", "SidewallPerm"]
|
|
1146
|
+
},
|
|
1147
|
+
color="Formation", # Color by formation
|
|
1148
|
+
shape="NetSand", # Shape by net sand flag
|
|
1149
|
+
regression_by_color="exponential-polynomial", # Separate trend per formation
|
|
1150
|
+
y_log=True, # Log scale for permeability
|
|
1151
|
+
title="Core vs Sidewall Analysis"
|
|
1152
|
+
)
|
|
1153
|
+
plot.show()
|
|
1154
|
+
|
|
1155
|
+
# Simpler version - automatic defaults
|
|
1156
|
+
manager.Crossplot(
|
|
1157
|
+
layers={
|
|
1158
|
+
"Core": ['CorePor', 'CorePerm'],
|
|
1159
|
+
"Sidewall": ["SidewallPor", "SidewallPerm"]
|
|
1160
|
+
},
|
|
1161
|
+
y_log=True
|
|
1162
|
+
).show()
|
|
1163
|
+
# Automatically uses shape="label" (different markers per layer)
|
|
1164
|
+
# and color="well" (different colors per well)
|
|
1165
|
+
```
|
|
1166
|
+
|
|
1167
|
+
**How it works:**
|
|
1168
|
+
|
|
1169
|
+
- `layers` dict maps labels to [x, y] property pairs
|
|
1170
|
+
- Each layer gets combined in one plot with unified axes
|
|
1171
|
+
- Shape defaults to `"label"` (Core gets circles, Sidewall gets squares)
|
|
1172
|
+
- Color defaults to `"well"` for multi-well visualization
|
|
1173
|
+
- Perfect for comparing different measurement types (Core plugs vs Formation tests)
|
|
1174
|
+
|
|
1136
1175
|
### Logarithmic Scales
|
|
1137
1176
|
|
|
1138
1177
|
Perfect for permeability and resistivity data:
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "well-log-toolkit"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.138"
|
|
8
8
|
description = "Fast LAS file processing with lazy loading and filtering for well log analysis"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -384,11 +384,18 @@ class _ManagerPropertyProxy:
|
|
|
384
384
|
|
|
385
385
|
@labels.setter
|
|
386
386
|
def labels(self, value: dict):
|
|
387
|
-
"""Set labels for this property in all wells.
|
|
387
|
+
"""Set labels for this property in all wells.
|
|
388
|
+
|
|
389
|
+
Also sets property type to 'discrete' if not already set,
|
|
390
|
+
since labels are only meaningful for discrete properties.
|
|
391
|
+
"""
|
|
388
392
|
count = 0
|
|
389
393
|
for well_name, well in self._manager._wells.items():
|
|
390
394
|
try:
|
|
391
395
|
prop = well.get_property(self._property_name)
|
|
396
|
+
# Auto-set type to discrete if labels are being set
|
|
397
|
+
if prop.type != 'discrete':
|
|
398
|
+
prop.type = 'discrete'
|
|
392
399
|
prop.labels = value
|
|
393
400
|
count += 1
|
|
394
401
|
except (AttributeError, PropertyNotFoundError):
|
|
@@ -2481,37 +2488,52 @@ class WellDataManager:
|
|
|
2481
2488
|
if well.name in self._name_mapping:
|
|
2482
2489
|
del self._name_mapping[well.name]
|
|
2483
2490
|
|
|
2491
|
+
def add_template(self, template: 'Template') -> None:
|
|
2492
|
+
"""
|
|
2493
|
+
Store a template using its built-in name.
|
|
2494
|
+
|
|
2495
|
+
Parameters
|
|
2496
|
+
----------
|
|
2497
|
+
template : Template
|
|
2498
|
+
Template object (uses template.name as the key)
|
|
2499
|
+
|
|
2500
|
+
Examples
|
|
2501
|
+
--------
|
|
2502
|
+
>>> from well_log_toolkit import Template
|
|
2503
|
+
>>>
|
|
2504
|
+
>>> template = Template("reservoir")
|
|
2505
|
+
>>> template.add_track(track_type="continuous", logs=[...])
|
|
2506
|
+
>>> manager.add_template(template) # Stored as "reservoir"
|
|
2507
|
+
>>>
|
|
2508
|
+
>>> # Use in WellView
|
|
2509
|
+
>>> view = well.WellView(template="reservoir")
|
|
2510
|
+
"""
|
|
2511
|
+
from .visualization import Template
|
|
2512
|
+
|
|
2513
|
+
if not isinstance(template, Template):
|
|
2514
|
+
raise TypeError(f"template must be Template, got {type(template).__name__}")
|
|
2515
|
+
|
|
2516
|
+
self._templates[template.name] = template
|
|
2517
|
+
|
|
2484
2518
|
def set_template(self, name: str, template: Union['Template', dict]) -> None:
|
|
2485
2519
|
"""
|
|
2486
|
-
Store a
|
|
2520
|
+
Store a template with a custom name (overrides template.name).
|
|
2487
2521
|
|
|
2488
|
-
|
|
2522
|
+
Use add_template() for the simpler case where the template's
|
|
2523
|
+
built-in name should be used.
|
|
2489
2524
|
|
|
2490
2525
|
Parameters
|
|
2491
2526
|
----------
|
|
2492
2527
|
name : str
|
|
2493
|
-
Template name for reference
|
|
2528
|
+
Template name for reference (overrides template.name)
|
|
2494
2529
|
template : Union[Template, dict]
|
|
2495
2530
|
Template object or dictionary configuration
|
|
2496
2531
|
|
|
2497
2532
|
Examples
|
|
2498
2533
|
--------
|
|
2499
|
-
>>>
|
|
2500
|
-
>>>
|
|
2501
|
-
>>> # Create and store template
|
|
2534
|
+
>>> # Store with a different name than the template's built-in name
|
|
2502
2535
|
>>> template = Template("reservoir")
|
|
2503
|
-
>>>
|
|
2504
|
-
... track_type="continuous",
|
|
2505
|
-
... logs=[{"name": "GR", "x_range": [0, 150], "color": "green"}]
|
|
2506
|
-
... )
|
|
2507
|
-
>>> manager.set_template("reservoir", template)
|
|
2508
|
-
>>>
|
|
2509
|
-
>>> # Use template in WellView
|
|
2510
|
-
>>> from well_log_toolkit.visualization import WellView
|
|
2511
|
-
>>> view = manager.well_36_7_5_A.WellView(
|
|
2512
|
-
... depth_range=[2800, 3000],
|
|
2513
|
-
... template="reservoir"
|
|
2514
|
-
... )
|
|
2536
|
+
>>> manager.set_template("reservoir_v2", template)
|
|
2515
2537
|
"""
|
|
2516
2538
|
from .visualization import Template
|
|
2517
2539
|
|
|
@@ -357,12 +357,18 @@ class Property(PropertyOperationsMixin):
|
|
|
357
357
|
"""
|
|
358
358
|
Set the label mapping and mark source as modified.
|
|
359
359
|
|
|
360
|
+
Also sets property type to 'discrete' if not already set,
|
|
361
|
+
since labels are only meaningful for discrete properties.
|
|
362
|
+
|
|
360
363
|
Parameters
|
|
361
364
|
----------
|
|
362
365
|
value : Optional[dict[int, str]]
|
|
363
366
|
Mapping of numeric values to label strings
|
|
364
367
|
"""
|
|
365
368
|
if value != self._labels:
|
|
369
|
+
# Auto-set type to discrete if labels are being set
|
|
370
|
+
if value is not None and self._type != 'discrete':
|
|
371
|
+
self.type = 'discrete' # Use setter to trigger value rounding
|
|
366
372
|
self._labels = value
|
|
367
373
|
self._mark_source_modified()
|
|
368
374
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: well-log-toolkit
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.138
|
|
4
4
|
Summary: Fast LAS file processing with lazy loading and filtering for well log analysis
|
|
5
5
|
Author-email: Kristian dF Kollsgård <kkollsg@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -1171,6 +1171,45 @@ plot = manager.Crossplot(
|
|
|
1171
1171
|
plot.show()
|
|
1172
1172
|
```
|
|
1173
1173
|
|
|
1174
|
+
#### Multi-Layer Crossplots
|
|
1175
|
+
|
|
1176
|
+
Combine different data types (Core vs Sidewall, different property pairs) in a single plot with automatic shape/color encoding:
|
|
1177
|
+
|
|
1178
|
+
```python
|
|
1179
|
+
# Compare Core and Sidewall data with regression by well
|
|
1180
|
+
plot = manager.Crossplot(
|
|
1181
|
+
layers={
|
|
1182
|
+
"Core": ['CorePor', 'CorePerm'],
|
|
1183
|
+
"Sidewall": ["SidewallPor", "SidewallPerm"]
|
|
1184
|
+
},
|
|
1185
|
+
color="Formation", # Color by formation
|
|
1186
|
+
shape="NetSand", # Shape by net sand flag
|
|
1187
|
+
regression_by_color="exponential-polynomial", # Separate trend per formation
|
|
1188
|
+
y_log=True, # Log scale for permeability
|
|
1189
|
+
title="Core vs Sidewall Analysis"
|
|
1190
|
+
)
|
|
1191
|
+
plot.show()
|
|
1192
|
+
|
|
1193
|
+
# Simpler version - automatic defaults
|
|
1194
|
+
manager.Crossplot(
|
|
1195
|
+
layers={
|
|
1196
|
+
"Core": ['CorePor', 'CorePerm'],
|
|
1197
|
+
"Sidewall": ["SidewallPor", "SidewallPerm"]
|
|
1198
|
+
},
|
|
1199
|
+
y_log=True
|
|
1200
|
+
).show()
|
|
1201
|
+
# Automatically uses shape="label" (different markers per layer)
|
|
1202
|
+
# and color="well" (different colors per well)
|
|
1203
|
+
```
|
|
1204
|
+
|
|
1205
|
+
**How it works:**
|
|
1206
|
+
|
|
1207
|
+
- `layers` dict maps labels to [x, y] property pairs
|
|
1208
|
+
- Each layer gets combined in one plot with unified axes
|
|
1209
|
+
- Shape defaults to `"label"` (Core gets circles, Sidewall gets squares)
|
|
1210
|
+
- Color defaults to `"well"` for multi-well visualization
|
|
1211
|
+
- Perfect for comparing different measurement types (Core plugs vs Formation tests)
|
|
1212
|
+
|
|
1174
1213
|
### Logarithmic Scales
|
|
1175
1214
|
|
|
1176
1215
|
Perfect for permeability and resistivity data:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit.egg-info/requires.txt
RENAMED
|
File without changes
|
{well_log_toolkit-0.1.136 → well_log_toolkit-0.1.138}/well_log_toolkit.egg-info/top_level.txt
RENAMED
|
File without changes
|