Fracture_Webapp / pages /1_LAS_Exploratory.py
Sonnt's picture
Upload 44 files
052f08d
import pandas as pd
import matplotlib.pyplot as plt
import lasio, os
import numpy as np
import os
import streamlit as st
import altair as alt
from streamlit_vega_lite import altair_component
from io import StringIO
from ui import *
from Antuns.page_setting import page_intro
from mLogsFunctions import *
from mLogsFunctions.fx import *
#-----------------------------------------------------------------------------
page_intro()
#1_LOADINGDATA-----------------------------------------------------------------
st.write("Log ASCII standard (LAS) is a standard file format common in the oil-and-gas and water well industries to store well log information. Well logging is used to investigate and characterize the subsurface stratigraphy in a well.")
# pagetile = """<center><h1>LAS EXPLORATORY</h1></center>"""
# st.markdown(pagetile, unsafe_allow_html=True)
st.subheader('To begin using the app, load your LAS file using the file upload option below.')
st.subheader("1. LAS File Loading:")
#------------------------------------------------------------------------------
#Streamlit Dashboard------------------------------------------------------------------------------------------
# set_page_config(page='custom')
hide_menu_button()
condense_layout()
#-----------------------------------------------------------------------------
@st.cache_data() #allow_output_mutation=True, suppress_st_warning=True
def upload_las(uploaded_files):
dataframes = {}
las_data_list = []
las_data = []
if uploaded_files is not None:
for file in uploaded_files:
try:
bytes_data = file.read()
str_io = StringIO(bytes_data.decode('Windows-1252'))
las_data = lasio.read(str_io)
well_data = las_data.df()
well_data['WELL'] = las_data.well.WELL.value
if well_data.index.name == 'DEPT':
well_data.reset_index('DEPT', inplace=True) # Set 'DEPT' as the new index
well_data.index.name = 'DEPT'
if len(well_data) > 0: # Kiểm tra xem dataframe có dữ liệu không
dataframes[file.name] = well_data
las_data_list.append(las_data)
else:
st.warning(f"No data in file {file.name}")
else:
well_data.index.name == 'DEPTH'
well_data.reset_index('DEPTH', inplace=True) # Set 'DEPTH' as the new index
well_data.index.name = 'DEPTH'
if len(well_data) > 0: # Kiểm tra xem dataframe có dữ liệu không
dataframes[file.name] = well_data
las_data_list.append(las_data)
except Exception as e:
st.error(f"Error loading {file.name}: {e}")
return dataframes, las_data_list, las_data
# Sidebar Options & File Upload
uploaded_files = st.file_uploader(label='Upload LAS files:', accept_multiple_files=True, type='las')
dataframes, las_data_list, las_data = upload_las(uploaded_files)
# print("print las data", las_data_list)
well_names = {}
if dataframes:
merged_df = []
for file_name, df in dataframes.items():
well_name = file_name.split(".")[0]
# Lấy danh sách các tên giếng
well_names = list(dataframes.keys())
# Cho phép người dùng chọn giếng và hiển thị DataFrame tương ứng
selected_well = st.selectbox("Select Well", well_names, key = "selected_well_1")
# st.write(f"Data for {selected_well}:")
st.write(dataframes[selected_well])
# Tạo một danh sách các DataFrame
dfs = [df for _, df in dataframes.items()]
merged_df = pd.concat([df for df in dfs])
# Hiển thị DataFrame tổng thể
st.write("Merged DataFrame:")
st.write(merged_df)
else:
print ("Please select LAS files for uploading ")
st.warning('No valid LAS files were uploaded.')
curves = []
wellname = []
las = las_data
list_well = []
if las:
for las_data in las_data_list:
well_name = las_data.well['WELL'].value
list_well.append(well_name)
# print(list_well)
st.success('File Uploaded Successfully')
st.write(f'<b>Well Name</b>: {list_well}', unsafe_allow_html=True)
# 2_CURVES_INFOMATION-----------------------------------------------------------------
if las:
st.subheader("2. Curve logs details:")
selected_well = st.selectbox("Select Well", well_names, key = "selected_well_2")
st.caption("All curve logs in data:")
curves = []
for well, las_file in zip(well_names, las_data_list):
if well == selected_well:
las = las_file
break
# print("in ra las:", las)
for curve in las.curves:
st.write(curve.mnemonic)
curves.append(curve.mnemonic)
for count, curve in enumerate(las.curves):
st.write("---")
st.write(f"Curve: {curve.mnemonic}, \t Units: {curve.unit}, \t Description: {curve.descr}")
st.write(f"There are a total of: {count+1} curves present within this file")
#3_DATAFRAME-----------------------------------------------------------------
if "selected_well" not in st.session_state:
st.session_state.selected_well = None
st.session_state.selected_well_multi = None
st.subheader("3. Converting LAS to DataFrame:")
st.caption("3.1 Preview of all Dataframe")
selected_well = st.selectbox("Select Well", well_names, key = "selected_well_5")
# print("Well_name", well_names)
# print("las_data_list", las_data_list)
for well, las_file in zip(well_names, las_data_list):
if well == selected_well:
las = las_file
break
# break
well = las.df()
well['WELL'] = las.well.WELL.value
well['DEPTH'] = well.index
well = well.reset_index(drop=True)
well = well.reindex(columns=['DEPTH'] + [col for col in well.columns if col != 'DEPTH'])
st.write(well.head())
st.caption("3.2 Well curves Statistics")
st.write(well.describe())
# print("in ra danh sách giếng", list_well)
# create a selectbox to choose the well
selected_well_multi = st.multiselect(" 3.3 Select well for download", list_well)
st.session_state.changename = st.button("Create", key="create_curve")
if st.session_state.changename:
dataframes_df = pd.concat(dataframes.values(), ignore_index=True)
st.session_state.selected_well_multi = dataframes_df.loc[dataframes_df['WELL'].isin(selected_well_multi)].reset_index(drop=True)
st.dataframe(st.session_state.selected_well_multi)
st.write(" Download DataFrame")
st.download_button(label='Download CSV File',
data = st.session_state.selected_well_multi.to_csv(),
file_name=f"{selected_well_multi}.csv",
mime='text/csv')
#4_Data Preprocessing-----------------------------------------------------------------
st.subheader("4. Data Preprocessing:")
st.session_state.old_name:str
st.session_state.new_name:str
st.session_state.changename:bool
st.session_state.well = None
st.write("4.1 Rename curves")
st.session_state.selected_well_rename = None
selected_well_rename = st.selectbox("Select Well", list_well, key="well_selectbox")
well_to_las = {}
well = []
data_rename_1 =[]
df_all_full = pd.DataFrame()
st.session_state.selected_well_rename = None
for i in range(len(well_names)):
well_to_las[well_names[i]] = las_data_list[i]
# print("key: ",well_names[i][:len(selected_well_rename)], " value: ",las_data_list[i])
if selected_well_rename == well_names[i][:len(selected_well_rename)]:
las = las_data_list[i]
break
# print("In ra las:", las)
well = las.df()
well['WELL'] = las.well.WELL.value
# print("In ra well2:", well)
curves = well.columns.tolist()
# print ("print ra cuvers:", curves) # save the number of curves for the selected well in session state
st.session_state.num_curves = len(curves)
df_rename = pd.DataFrame()
st.session_state.selected_well_rename = df_rename
st.session_state.selected_well_rename = well
import pandas as pd
# Khởi tạo DataFrame từ dữ liệu có sẵn
# Khởi tạo thuộc tính selected_well_rename trong st.session_state
st.session_state.setdefault('selected_well_rename', 'Default value')
# Truy cập thuộc tính selected_well_rename
data = st.session_state.selected_well_rename
if 'columns' in data:
n_cols = 4
n_rows = -(-len(data.columns) // n_cols) # Round up division
for i in range(n_rows):
cols = st.columns(n_cols)
for j in range(n_cols):
idx = i * n_cols + (j-1)
if idx < len(data.columns):
col = data.columns[idx]
# Lưu trữ tên cũ trong biến old_col
old_col = col
# new_col == well_names[i][:len(col)]
new_col = cols[j-1].text_input(f"Enter new name for '{col}'", key=f"input_{cols}")
# Kiểm tra nếu người dùng không nhập tên mới
if not new_col:
# Sử dụng tên cũ thay thế
new_col = old_col
data = data.rename(columns={col: new_col})
data["DEPTH"] = well.index
data.insert(0, 'DEPTH', data.pop('DEPTH'))
data = data.reset_index(drop=True)
st.dataframe(data)
else:
print ("Please select LAS files for input data")
# Hiển thị lại bảng
def my_function(data):
# Lưu trữ DataFrame khi người dùng nhấn vào nút "Lưu"
if st.button("Lưu", key="saved_rename"):
# Tạo tên file CSV dựa trên biến selected_well_rename
file_name = f"/work/2022_VPIMLogs_WebApp/data/change_name_logs/{selected_well_rename}.csv"
# Lưu trữ DataFrame vào tệp CSV với tên file tương ứng
data.to_csv(file_name, index=False)
# Trả về giá trị của biến result
return data
result = my_function(data)
# for name in selected_well_multi:
# # dataframe_merged_df = pd.DataFrame()
# merged_df = pd.read_csv("data/change_name_logs/merged_df.csv")
# dataframe_merged_df.append(merged_df[merged_df.WELL==name])
# dataframe_merged_df.to_csv("data/change_name_logs/merged_df.csv")
# st.dataframe(dataframe_merged_df, width=1400)
selected_well_multi= st.multiselect(" 4.3 Select well for download", list_well, key = 'selected_well_multi_lasts')
# dowload_dataframes_df = pd.DataFrame()
st.session_state.changename_download = st.button("Create", key="selected_well_multi_rename_curve_111")
# Đường dẫn đến thư mục chứa các file csv
dir_path = '/work/2022_VPIMLogs_WebApp/data/change_name_logs/'
if st.session_state.changename_download:
# Tạo một DataFrame rỗng để chứa dữ liệu
merged_df = pd.DataFrame()
dataframe_merged_df = pd.DataFrame()
# Duyệt qua tất cả các file trong thư mục và gộp chúng vào DataFrame
for filename in os.listdir(dir_path):
if filename.endswith('.csv'):
filepath = os.path.join(dir_path, filename)
df = pd.read_csv(filepath)
merged_df = pd.concat([merged_df, df], ignore_index=True).reset_index(drop=True)
merged_df.to_csv(f"/work/2022_VPIMLogs_WebApp/data/merged/{selected_well_multi}_merged_df.csv")
dataframes_df = pd.read_csv(f"/work/2022_VPIMLogs_WebApp/data/merged/{selected_well_multi}_merged_df.csv")
st.session_state.selected_well_multi = dataframes_df.loc[dataframes_df['WELL'].isin(selected_well_multi)].reset_index(drop=True).drop('Unnamed: 0', axis = 1)
st.dataframe(st.session_state.selected_well_multi , width=1400)
# 4.3_DOWNLOAD-----------------------------------------------------------------
st.write("4.3 Download well curves with renamed names")
st.download_button(label='Download CSV File',
data = st.session_state.selected_well_multi.to_csv(),
file_name=f"{selected_well_multi}.csv",
mime='text/csv')
for filename in os.listdir(dir_path):
if filename.endswith('.csv'):
os.remove(os.path.join(dir_path, filename))
#'''Adding the ‘download’ tag attribute as shown below allows you to provide a file name and extension.
#f'<a href="data:file/csv;base64,{b64}" download="myfilename.csv">Download csv file</a>'''
hide_menu_button()
condense_layout()