Spaces:
Sleeping
Sleeping
| 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() | |
| #----------------------------------------------------------------------------- | |
| #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() |