Well

Some preliminaries...


In [1]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import welly
welly.__version__


Out[1]:
'0.4.7'

In [2]:
import os
env = %env

Make an 'empty' well


In [3]:
w = welly.Well()

In [4]:
w.header.uwi = 'foo'

In [5]:
w.header


Out[5]:
{'name': '', 'uwi': 'foo'}

In [6]:
w.uwi


Out[6]:
'foo'

Or, instantiate with some basic data:


In [7]:
w = welly.Well(params={'header': {'name': 'foo', 'uwi':'05045123450000'}})

In [8]:
w.header


Out[8]:
{'name': 'foo', 'uwi': '05045123450000'}

In [9]:
w.header['uwi']


Out[9]:
'05045123450000'

The well name and UWI are also provided at the well level for convenience:


In [10]:
w.name, w.uwi


Out[10]:
('foo', '05045123450000')

Load a well from LAS

Use the from_las() method to load a well by passing a filename as a str.

This is really just a wrapper for lasio but instantiates a Header, Curves, etc.


In [4]:
from welly import Well

In [5]:
w = Well.from_las('P-129_out.LAS')

In [40]:
w.data['GR'].null = -111.11

In [41]:
w.las.well["NULL"].value = -111.11

In [49]:
w.header


Out[49]:
{'name': 'Kennetcook #2', 'uwi': "Long = 63* 45'24.460  W", 'field': 'Windsor Block', 'license': 'P-129', 'company': 'Elmworth Energy Corporation'}

In [47]:
l = w.to_lasio()

In [48]:
l.well['NULL']


Out[48]:
HeaderItem(mnemonic=NULL, unit=, value=-9999.25, descr=NULL VALUE)

In [9]:
w.to_las('x.las', null_value=-111.111)

In [10]:
!ls -l x.las


-rw-r--r-- 1 matt matt 3517277 Nov 14 15:14 x.las

In [11]:
!head -100 x.las


~Version ---------------------------------------------------
VERS.   2.0 : CWLS log ASCII Standard -VERSION 2.0
WRAP.    NO : One line per depth step
DLM . SPACE : Column Data Section Delimiter
~Well ------------------------------------------------------
STRT.m                     1.0668 : START DEPTH
STOP.m         1939.1376000000012 : STOP DEPTH
STEP.m         0.1524000000000001 : STEP
NULL.                    -111.111 : NULL VALUE
COMP. Elmworth Energy Corporation : COMPANY
WELL.               Kennetcook #2 : WELL
FLD .               Windsor Block : FIELD
LOC .     Lat = 45* 12' 34.237" N : LOCATION
PROV.                 Nova Scotia : PROVINCE
CNTY.                        None : COUNTY
STAT.                        None : STATE
CTRY.                          CA : COUNTRY
SRVC.                             : SERVICE COMPANY
DATE.  2019-11-14 15:14:14.398183 : DATE
UWI .     Long = 63* 45'24.460  W : UNIQUE WELL ID
API .                        None : API NUMBER
LIC .                       P-129 : 
LATI.                             : 
LONG.                             : 
NS  .                        None : 
EW  .                        None : 
GDAT.                             : 
SECT.                 45.20 Deg N : 
RANG.                      PD 176 : 
TOWN.                 63.75 Deg W : 
~Curve Information -----------------------------------------
DEPT    .m      : 
CALI    .in     : Caliper
HCAL    .in     : HRCC Cal. Caliper
PEF     .       : Photoelectric Factor
DT      .us/ft  : DT
DTS     .us/ft  : DTS
DPHI_SAN.m3/m3  : Density Porosity (matrix Sandstone)
DPHI_LIM.m3/m3  : Density Porosity (matrix Limestone)
DPHI_DOL.m3/m3  : Density Porosity (matrix Dolomite)
NPHI_SAN.m3/m3  : Thermal Neutron Porosity (matrix Sandstone)
NPHI_LIM.m3/m3  : Thermal Neutron Porosity (matrix Limestone)
NPHI_DOL.m3/m3  : Thermal Neutron Porosity (matrix Dolomite)
RLA5    .ohm.m  : HRLT Borehole Corrected Resistivity 5
RLA3    .ohm.m  : HRLT Borehole Corrected Resistivity 3
RLA4    .ohm.m  : HRLT Borehole Corrected Resistivity 4
RLA1    .ohm.m  : HRLT Borehole Corrected Resistivity 1
RLA2    .ohm.m  : HRLT Borehole Corrected Resistivity 2
RXOZ    .ohm.m  : MCFL Standard Resolution Invaded Zone Resistivity
RXO_HRLT.ohm.m  : 
RT_HRLT .ohm.m  : HRLT Computed True Resistivity
RM_HRLT .ohm.m  : HRLT Mud Resistivity
DRHO    .g/cm3  : HRDD Density Correction
RHOB    .g/cm3  : Bulk Density
GR      .gAPI   : Gamma-Ray
SP      .mV     : SP
~Params ----------------------------------------------------
EKB.   94.8 : 
EGL.   90.3 : 
TD .   None : 
TDD. 1935.0 : 
TDL. 1935.0 : 
~Other -----------------------------------------------------
~ASCII -----------------------------------------------------
    1.06680    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    1.21920    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    1.37160    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    1.52400    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    1.67640    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    1.82880    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    1.98120    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    2.13360    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    2.28600    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    2.43840    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    2.59080    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    2.74320    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    2.89560    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    3.04800    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    3.20040    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    3.35280    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    3.50520    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    3.65760    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    3.81000    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    3.96240    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    4.11480    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    4.26720    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    4.41960    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    4.57200    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    4.72440    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    4.87680    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    5.02920    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    5.18160    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    5.33400    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    5.48640    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    5.63880    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    5.79120    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    5.94360    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    6.09600    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    6.24840    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500
    6.40080    2.44382    4.39128    3.58640   -111.111   -111.111    0.15748    0.19844    0.25910    0.46510    0.33647    0.30186    0.02558    0.02675    0.02562    0.03210    0.02794    0.05761    0.02558    0.02558    0.05501    0.19423    2.39015   46.69865  120.12500

In [13]:
w.las.params['UWID'].value


Out[13]:
''

In [14]:
tracks = ['MD', 'GR', 'RHOB', ['DT', 'DTS'], 'MD']
w.plot(tracks=tracks)


Aliases and curve quality

We can define aliases for curves, and check the quality of curves with a dictionary of tests:


In [18]:
alias = {
    "Gamma": ["GR", "GAM", "GRC", "SGR", "NGT"],
    "Density": ["RHOZ", "RHOB", "DEN", "RHOZ"],
    "Sonic": ["DT", "AC", "DTP", "DT4P"],
    "Caliper": ["CAL", "CALI", "CALS", "C1"],
    'Porosity SS': ['NPSS', 'DPSS'],
}

In [8]:
import welly.quality as q

tests = {
    'Each': [
        q.no_flat,
        q.no_monotonic,
        q.no_gaps,
    ],
    'Gamma': [
        q.all_positive,
        q.all_below(450),
        q.check_units(['API', 'GAPI']),
    ],
    'DT': [
        q.all_positive,
    ],
    'Sonic': [
        q.all_between(1, 10000),  # 1333 to 5000 m/s
        q.no_spikes(10),          # 10 spikes allowed
    ],
}

In [9]:
w = Well.from_las('P-129_out.LAS')
r = w.qc_data(tests, alias=alias)

This returns a dictionary of curves in which the values are dictionaries of test name: test result pairs.


In [10]:
r


Out[10]:
{'CALI': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'HCAL': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'PEF': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'DT': {'no_flat': True,
  'no_monotonic': True,
  'no_gaps': True,
  'all_positive': True,
  'all_between': True,
  'no_spikes': False},
 'DTS': {'no_flat': True, 'no_monotonic': True, 'no_gaps': True},
 'DPHI_SAN': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'DPHI_LIM': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'DPHI_DOL': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'NPHI_SAN': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'NPHI_LIM': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'NPHI_DOL': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RLA5': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RLA3': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RLA4': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RLA1': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RLA2': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RXOZ': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RXO_HRLT': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RT_HRLT': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RM_HRLT': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'DRHO': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'RHOB': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True},
 'GR': {'no_flat': False,
  'no_monotonic': False,
  'no_gaps': True,
  'all_positive': True,
  'all_below': True,
  'check_units': False},
 'SP': {'no_flat': False, 'no_monotonic': False, 'no_gaps': True}}

There's also an HTML table for rendering in Notebooks:


In [11]:
from IPython.display import HTML
html = w.qc_table_html(tests, alias=alias)
HTML(html)


Out[11]:
CurvePassedScorecheck_unitsno_gapsall_belowno_spikesall_betweenno_monotonicno_flatall_positive
CALI1 / 30.333TrueFalseFalse
HCAL1 / 30.333TrueFalseFalse
PEF1 / 30.333TrueFalseFalse
DT5 / 60.833TrueFalseTrueTrueTrueTrue
DTS3 / 31.000TrueTrueTrue
DPHI_SAN1 / 30.333TrueFalseFalse
DPHI_LIM1 / 30.333TrueFalseFalse
DPHI_DOL1 / 30.333TrueFalseFalse
NPHI_SAN1 / 30.333TrueFalseFalse
NPHI_LIM1 / 30.333TrueFalseFalse
NPHI_DOL1 / 30.333TrueFalseFalse
RLA51 / 30.333TrueFalseFalse
RLA31 / 30.333TrueFalseFalse
RLA41 / 30.333TrueFalseFalse
RLA11 / 30.333TrueFalseFalse
RLA21 / 30.333TrueFalseFalse
RXOZ1 / 30.333TrueFalseFalse
RXO_HRLT1 / 30.333TrueFalseFalse
RT_HRLT1 / 30.333TrueFalseFalse
RM_HRLT1 / 30.333TrueFalseFalse
DRHO1 / 30.333TrueFalseFalse
RHOB1 / 30.333TrueFalseFalse
GR3 / 60.500FalseTrueTrueFalseFalseTrue
SP1 / 30.333TrueFalseFalse

Add a striplog


In [12]:
from striplog import Legend, Striplog
legend = Legend.builtin('NSDOE')
strip = Striplog.from_image('P-129_280_1935.png', 280, 1935, legend=legend)
strip.plot()



In [13]:
w.data['strip'] = strip

In [14]:
tracks = ['MD', 'strip', 'GR', 'RHOB', ['DT', 'DTS'], 'MD']
w.plot(tracks=tracks)
plt.ylim(1000, 1200)


Out[14]:
(1000, 1200)

Maybe should be called 'meta' as it's not really a header...


In [15]:
w.header


Out[15]:
{'name': 'Kennetcook #2', 'uwi': "Long = 63* 45'24.460  W", 'field': 'Windsor Block', 'license': 'P-129', 'company': 'Elmworth Energy Corporation'}

In [16]:
w.header.name


Out[16]:
'Kennetcook #2'

In [17]:
w.uwi  # Fails because not present in this file. See one way to add it in a minute.


Out[17]:
"Long = 63* 45'24.460  W"

Location and CRS


In [18]:
w.location


Out[18]:
Location({'td': 1935.0, 'crs': CRS({}), 'location': 'Lat = 45* 12\' 34.237" N', 'country': 'CA', 'province': 'Nova Scotia', 'section': '45.20 Deg N', 'range': 'PD 176', 'township': '63.75 Deg W', 'kb': 94.8, 'gl': 90.3, 'tdd': 1935.0, 'tdl': 1935.0, 'deviation': None, 'position': None})

In [19]:
from welly import CRS
w.location.crs = CRS.from_epsg(2038)

In [20]:
w.location.crs


Out[20]:
CRS({'init': 'epsg:2038', 'no_defs': True})

Right now there's no position log — we need to load a deviation survey.


In [21]:
w.location.position

Add deviation data to a well


In [3]:
import numpy as np
from welly import Well

p = Well.from_las('P-130_out.LAS')

In [4]:
dev = np.loadtxt('P-130_deviation_survey.csv', delimiter=',', skiprows=1)

The columns are MD, inclination, azimuth, and TVD.


In [5]:
dev[:5]


Out[5]:
array([[ 18. ,   0.3,   0. ,  18. ],
       [ 38. ,   0.5,   0. ,  38. ],
       [ 57. ,   1.5,   0. ,  57. ],
       [ 84. ,   1.8,   0. ,  84. ],
       [104. ,   0.5,   0. , 104. ]])

add_deviation assumes those are the columns, and computes a position log.


In [6]:
p.location.add_deviation(dev[:, :3], td=2618.3)

The columns in the position log are x offset, y offset, and TVD.


In [7]:
p.location.position[:5]


Out[7]:
array([[0.00000000e+00, 0.00000000e+00, 0.00000000e+00],
       [0.00000000e+00, 4.71237821e-02, 1.79999178e+01],
       [0.00000000e+00, 1.86748917e-01, 3.79994202e+01],
       [0.00000000e+00, 5.18340431e-01, 5.69962853e+01],
       [0.00000000e+00, 1.29577626e+00, 8.39850594e+01]])

In [8]:
p.location.trajectory()


Out[8]:
array([[ 6.45933639e-01,  3.47023772e-01, -1.65395432e-02],
       [ 5.90396925e-01,  3.28218888e-01, -2.63643779e+00],
       [ 5.36457735e-01,  3.11968468e-01, -5.25632568e+00],
       ...,
       [-3.68094384e+00,  3.97484953e+01, -2.61112780e+03],
       [-3.68832058e+00,  3.96833189e+01, -2.61374906e+03],
       [-3.69619567e+00,  3.96172858e+01, -2.61637033e+03]])

In [9]:
p.location.plot_plan()



In [10]:
p.location.plot_3d()


Export curves to data matrix

Make a NumPy array:


In [27]:
w.data_as_matrix()


Out[27]:
array([[  2.44381547,   4.39128494,   3.58640003, ...,   2.39014983,
         46.69865036, 120.125     ],
       [  2.44381547,   4.39128494,   3.58640003, ...,   2.39014983,
         46.69865036, 120.125     ],
       [  2.44381547,   4.39128494,   3.58640003, ...,   2.39014983,
         46.69865036, 120.125     ],
       ...,
       [         nan,          nan,          nan, ...,          nan,
                 nan,          nan],
       [         nan,          nan,          nan, ...,          nan,
                 nan,          nan],
       [         nan,          nan,          nan, ...,          nan,
                 nan,          nan]])

Export curves to pandas

Pandas is an optional dependency. You'll need it to make this work.


In [4]:
df = w.df()

In [5]:
df.head()


Out[5]:
CALI HCAL PEF DT DTS DPHI_SAN DPHI_LIM DPHI_DOL NPHI_SAN NPHI_LIM ... RLA1 RLA2 RXOZ RXO_HRLT RT_HRLT RM_HRLT DRHO RHOB GR SP
Depth
1.0668 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.0321 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125
1.2192 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.0321 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125
1.3716 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.0321 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125
1.5240 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.0321 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125
1.6764 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.0321 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125

5 rows × 24 columns


In [7]:
df.GR.plot()


Out[7]:
<matplotlib.axes._subplots.AxesSubplot at 0x7feded5afe10>

This also gives us another path to getting a matrix:


In [31]:
w.df().values


Out[31]:
array([[  2.44381547,   4.39128494,   3.58640003, ...,  46.69865036,
        120.125     ,          nan],
       [  2.44381547,   4.39128494,   3.58640003, ...,  46.69865036,
        120.125     ,          nan],
       [  2.44381547,   4.39128494,   3.58640003, ...,  46.69865036,
        120.125     ,          nan],
       ...,
       [         nan,          nan,          nan, ...,          nan,
                 nan,          nan],
       [         nan,          nan,          nan, ...,          nan,
                 nan,          nan],
       [         nan,          nan,          nan, ...,          nan,
                 nan,          nan]])

You'll have to get depth separately:


In [32]:
w.df().index.values


Out[32]:
array([1.0668000e+00, 1.2192000e+00, 1.3716000e+00, ..., 2.5057608e+03,
       2.5059132e+03, 2.5060656e+03])

To get the UWI of the well as well, e.g. if you want to combine multiple wells (maybe using welly.Project.df()):


In [33]:
df = w.df(uwi=True)

In [34]:
df.head()


Out[34]:
CALI HCAL PEF DT DTS DPHI_SAN DPHI_LIM DPHI_DOL NPHI_SAN NPHI_LIM ... RLA2 RXOZ RXO_HRLT RT_HRLT RM_HRLT DRHO RHOB GR SP strip
UWI Depth
Long = 63* 45'24.460 W 1.0668 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125 NaN
1.2192 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125 NaN
1.3716 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125 NaN
1.5240 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125 NaN
1.6764 2.443815 4.391285 3.5864 NaN NaN 0.15748 0.19844 0.2591 0.4651 0.33647 ... 0.02794 0.05761 0.02558 0.02558 0.05501 0.194233 2.39015 46.69865 120.125 NaN

5 rows × 25 columns

Pandas with an alias dictionary


In [6]:
alias


Out[6]:
{'Gamma': ['GR', 'GAM', 'GRC', 'SGR', 'NGT'],
 'Density': ['RHOZ', 'RHOB', 'DEN', 'RHOZ'],
 'Sonic': ['DT', 'AC', 'DTP', 'DT4P'],
 'Caliper': ['CAL', 'CALI', 'CALS', 'C1'],
 'Porosity SS': ['NPSS', 'DPSS']}

In [10]:
keys = ['CALI', 'Gamma', 'Density', 'Sonic', 'RLA1']
w.df(keys=keys, alias=alias, rename_aliased=True).head()


Out[10]:
CALI Gamma Density Sonic RLA1
Depth
1.0668 2.443815 46.69865 2.39015 NaN 0.0321
1.2192 2.443815 46.69865 2.39015 NaN 0.0321
1.3716 2.443815 46.69865 2.39015 NaN 0.0321
1.5240 2.443815 46.69865 2.39015 NaN 0.0321
1.6764 2.443815 46.69865 2.39015 NaN 0.0321

In [ ]: