No project description provided
Project description
well-model
Python scripts for ingestion and query of wells in CDF. Also some notebook examples on how to use are available in the examples folder.
Running locally
Install poetry
If you don't yet have poetry installed and configured to use artifactory, follow the steps in Cognite's Python guide
Install dependencies
In the root folder of the project, use poetry to install dependencies:
poetry install
Add pre-commit
Pre-commit will allow you to test your changes in the linting and formatting tools before commiting them, to avoid failing the Jenkins build. It is installed as a dev dependency in the project, so yu just have to initialize by running:
pre-commit install
Environment variables
export COGNITE_API_KEY="<use an api key for subsurface-test. If you don't have one, ask a member of the team>"
export COGNITE_PROJECT="subsurface-test"
Run tests
poetry run pytest
Model files generated from openapi
We use datamodel-code-generator to generated pydantic model files based on the openapi.yaml file. To update it, run
poetry run make generate-pydantic
Or if you want to copy the openapi.yaml file from ../well-service
first, run
poetry run make pydantic
Consuming
Optionally set your env variables (must be valid for both cdf and geospatial API)
COGNITE_WELLS_PROJECT=<project-tenant>
COGNITE_WELLS_CREDENTIALS=<your-api-key>
Project and key can then be accessed without exposing them in the code. Alternatively, the client can be initialised like:
wells_client = CogniteWellsClient(project="your-project", api_key="your-api-key")
### Set up client with Api-Key
```python
import os
from cognite.well_model import CogniteWellsClient
wells_client = CogniteWellsClient(project=os.getenv("COGNITE_WELLS_PROJECT"), api_key=os.getenv("COGNITE_WELLS_CREDENTIALS"))
Well queries
Get well by id:
well = wells_client.wells.get_by_id(8456650753594878)
List wells:
wells = wells_client.wells.list()
Filter wells by wkt polygon:
from cognite.well_model.models import PolygonFilter
polygon = 'POLYGON ((0.0 0.0, 0.0 80.0, 80.0 80.0, 80.0 0.0, 0.0 0.0))'
wells = wells_client.wells.filter(polygon=PolygonFilter(geometry=polygon, crs="epsg:4326"))
Filter wells by wkt polygon, name/description and specify desired outputCrs
polygon = 'POLYGON ((0.0 0.0, 0.0 80.0, 80.0 80.0, 80.0 0.0, 0.0 0.0))'
wells = wells_client.wells.filter(
polygon=PolygonFilter(geometry=polygon, crs="epsg:4326", geometry_type="WKT"),
string_matching="16/",
output_crs="EPSG:23031"
)
Get wells that have a trajectory
from cognite.well_model.models import TrajectoryFilter
wells = wells_client.wells.filter(has_trajectory=TrajectoryFilter(), limit=None)
Get wells that have a trajectory with data between certain depths
wells = wells_client.wells.filter(has_trajectory=TrajectoryFilter(min_depth=1400.0, max_depth=1500.0), limit=None)
Get wells that has the right set of measurement types
from cognite.well_model.models import MeasurementFilter, MeasurementFilters, MeasurementType
gammarayFilter = MeasurementFilter(measurement_type=MeasurementType.gamma_ray)
densityFilter = MeasurementFilter(measurement_type=MeasurementType.density)
# Get wells with all measurements
measurements_filter = MeasurementFilters(contains_all=[gammarayFilter, densityFilter])
wells = wells_client.wells.filter(has_measurements=measurements_filter, limit=None)
# Or get wells with any of the measurements
measurements_filter = MeasurementFilters(contains_any=[gammarayFilter, densityFilter])
wells = wells_client.wells.filter(has_measurements=measurements_filter, limit=None)
Get wellbores for a well id:
wellbores = wells_client.wellbores.get_from_well(well.id)
or
well = wells_client.wells.get_by_id(519497487848)
wellbores = well.wellbores()
Get wellbores from multiple well ids:
wellbores = wells_client.wellbores.get_from_wells([17257290836510, 8990585729991697])
Filter - list all labels:
blocks = wells_client.wells.blocks()
fields = wells_client.wells.fields()
operators = wells_client.wells.operators()
quadrants = wells_client.wells.quadrants()
sources = wells_client.wells.sources()
measurementTypes = wells_client.wells.measurements()
Wellbore queries
Get wellbore by id:
wellbore = wells_client.wellbores.get_by_id(2360682364100853)
Get wellbore measurement for measurementType: 'GammaRay':
measurements = wells_client.wellbores.get_measurement(wellbore_id=2360682364100853, measurement_type=MeasurementType.gamma_ray)
Get trajectory for a wellbore:
wellbore = wells_client.wellbores.get_by_id(2360682364100853)
trajectory = wellbore.trajectory()
Or get it directly from a wellbore id
trajectory = wells_client.surveys.get_trajectory(2360682364100853)
Survey queries
Get data from a survey, from start and end rows:
trajectory_data = wells_client.surveys.get_data(17257290836510, start=0, end=100000, columns=["MD", "AZIMUTH"])
Get all data from a survey object
trajectory = wells_client.surveys.get_trajectory(2360682364100853)
trajectory_data = trajectory.data()
Ingestion
Ingest wells
import os
from datetime import date
from cognite.well_model import CogniteWellsClient
from cognite.well_model.models import DoubleWithUnit, WellDatum, Wellhead, WellIngestion
wells_client = CogniteWellsClient(project=os.getenv("COGNITE_PROJECT"), api_key=os.getenv("COGNITE_API_KEY"))
source_asset_id = 102948135620745 # Id of the well source asset in cdf
well_to_create = WellIngestion(
asset_id=source_asset_id,
well_name="well-name",
description="Optional description for the well",
country="Norway",
quadrant="25",
block="25/5",
field="Example",
operator="Operator1",
spud_date=date(2021, 3, 17),
water_depth=0.0,
water_depth_unit="meters",
wellhead=Wellhead(
x = 21.0,
y = 42.0,
crs = "EPSG:4236" # Must be a EPSG code
),
datum=WellDatum(
elevation = DoubleWithUnit(value=1.0, unit="meters"),
reference = "well-datum-reference",
name = "well-datum-name"
),
source="Source System Name"
)
wells_client.ingestion.ingest_wells([well_to_create]) # Can add multiple WellIngestion objects at once
Ingest wellbores with optional well and/or trajectory
import os
from cognite.well_model import CogniteWellsClient
from cognite.well_model.models import DoubleArrayWithUnit, TrajectoryIngestion, WellIngestion, WellboreIngestion, ParentType
wells_client = CogniteWellsClient(project=os.getenv("COGNITE_PROJECT"), api_key=os.getenv("COGNITE_API_KEY"))
source_asset_id = 102948135620745 # Id of the wellbore source asset in cdf
source_trajectory_ext_id = "some sequence ext id" # Id of the source sequence in cdf
well_to_create = WellIngestion(...)
trajectory_to_create = TrajectoryIngestion(
source_sequence_ext_id=source_trajectory_ext_id,
measured_depths = DoubleArrayWithUnit(values=[0.0, 1.0, 2.0], unit="meters"),
inclinations = DoubleArrayWithUnit(values=[10.0, 1.0, 22.0], unit="degrees"),
azimuths = DoubleArrayWithUnit(values=[80.0, 81.0, 82.0], unit="degrees")
)
wellbore_to_create = WellboreIngestion(
asset_id = source_asset_id,
wellbore_name = "wellbore name",
parent_name = "name of parent well or wellbore",
parent_type = ParentType.well, # or ParentType.wellbore
source = "Source System Name",
trajectory_ingestion = trajectory_to_create,
well_ingestion = well_to_create # if not ingesting a well, then one must already exist
)
wells_client.ingestion.ingest_wells([wellbore_to_create]) # Can add multiple WellboreIngestion objects at once
Ingest wellbores with optional well and/or trajectory
import os
from cognite.well_model import CogniteWellsClient
from cognite.well_model.models import DoubleArrayWithUnit, CasingIngestion
wells_client = CogniteWellsClient(project=os.getenv("COGNITE_PROJECT"), api_key=os.getenv("COGNITE_API_KEY"))
source_casing_id = 102948135620745 # Id of the casing source sequence in cdf
casing_to_ingest = CasingIngestion(
source_casing_id = source_casing_id,
wellbore_name = "wellbore name",
casing_name = "Surface Casing",
body_inside_diameter = DoubleArrayWithUnit(values=[100.0, 120.0, 130.0], unit="mm"),
body_outside_diameter = DoubleArrayWithUnit(values=[100.0, 120.0, 130.0], unit="mm"),
md_top = DoubleArrayWithUnit(values=[100.0, 120.0, 130.0], unit="m"),
md_base = DoubleArrayWithUnit(values=[120.0, 150.0, 190.0], unit="m"),
tvd_top = DoubleArrayWithUnit(values=[100.0, 120.0, 130.0], unit="m"), # TVD measurements are optional
tvd_base = DoubleArrayWithUnit(values=[120.0, 150.0, 190.0], unit="m") # TVD measurements are optional
)
wells_client.ingestion.ingest_casings([casing_to_ingest]) # Can add multiple CasingIngestion objects at once
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for cognite_wells_sdk-0.5.4-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 67a461c92229ac31b79ef202232895fc039dad66b411a912908462c90b48b214 |
|
MD5 | c8fdd8ef4c2d1b0b1264507c22b9ecdc |
|
BLAKE2b-256 | dd0178680f33eca5cc505f150d68862ae06ce103ba8b39f13d061045ad8b7d73 |