Source code for pygeopressure.basic.las

# -*- coding: utf-8 -*-
"""
an interface for interacting with Las file

Created on Thu May 10 2018
"""
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

__author__ = "yuhao"

from builtins import open
from future.utils import native
import numpy as np
import pandas as pd

from pygeopressure.pressure.hydrostatic import hydrostatic_pressure
from pygeopressure.pressure.eaton import eaton
from pygeopressure.velocity.extrapolate import normal
from pygeopressure.basic.well_log import Log
from pygeopressure.basic.las_reader import LASReader

from . import Path


[docs]class LasData(object): """ Class for reading LAS and pseudo-LAS file data null_values could be set to more values in order to deal with messy files """ def __init__(self, las_file): self.las_file = las_file self.null_values = [-999.25, 1.0e30] self._file_type = None self._data_frame = None self._logs = None self._units = None self.depth_unit = "m" @property def file_type(self): if self._file_type is None: with open(self.las_file, "r") as fl: first_line = fl.readline() if first_line[0] == '~': self._file_type = "las" else: self._file_type = "pseudo-las" return self._file_type else: return self._file_type @property def data_frame(self): if self._data_frame is None: if self.file_type is "las": self.read_las() else: self.read_pseudo_las() return self._data_frame
[docs] def read_pseudo_las(self): df = pd.read_csv(self.las_file, sep='\t') for value in self.null_values: df = df.replace(value, np.nan) # replace 1e30 with np.nan df = df.round({df.columns[0]: 1}) # round depth to 1 decimal if 'Depth(M)' in df.columns.values.tolist(): df.rename(columns={'Depth(M)': 'Depth(m)'}, inplace=True) self._data_frame = df
# data.to_hdf(self.hdf5_file, well_name)
[docs] def read_las(self): if Path(native(self.las_file)).exists(): las = LASReader(native(str(Path(self.las_file))), null_subs=np.nan) # well_name = las.well.items['WELL'].data df = pd.DataFrame( las.data2d, columns=["{}({})".format( las.curves.items[name].descr.replace(' ', '_'), las.curves.items[name].units) \ for name in las.curves.names]) if 'Depth(M)' in df.columns.values.tolist(): df.rename(columns={'Depth(M)': 'Depth(m)'}, inplace=True) self._data_frame = df
[docs] def find_logs(self): self._logs = [] self._units = [] for name in self.data_frame.columns.values: str_list = name.split("(") if str_list[0] != "Depth": self._logs.append(str_list[0]) self._units.append(str_list[1][:-1]) else: self.depth_unit = str_list[1][:-1]
@property def logs(self): if self._logs is None: self.find_logs() return self._logs @property def units(self): if self._units is None: self.find_logs() return self._units