import streamlit as st import pandas as pd from datetime import datetime from streamlit_ext import download_button as down_btn def generate_perforations(df,plug_df): content = "UNITS METRIC\n\n" # Iterate through unique well names for well_name in df['well'].unique(): content += f'WELLNAME "{well_name}"\n' # Filter the dataframe for the current well well_df = df[df['well'] == well_name] # Iterate through rows of the filtered dataframe for index, row in well_df.iterrows(): if row['type'] == 'p': date = row['date'].strftime('%d/%m/%Y') top = row['top'] btm = row['btm'] # Write the perforation line to the content content += f'{date} perforation {top} {btm} 0.1905 0 0 0\n' if row['type'] == 's': date = row['date'].strftime('%d/%m/%Y') top = row['top'] btm = row['btm'] # Write the shut-in line to the content content += f'{date} squeeze {top} {btm}\n' # Filter the plug dataframe for the current well plug_well_df = plug_df[plug_df['well'] == well_name] # Iterate through rows of the filtered plug dataframe for index, plug_row in plug_well_df.iterrows(): date = plug_row['date'].strftime('%d/%m/%Y') depth = plug_row['depth'] # Filter the well dataframe based on the plug depth filtered_well_df = well_df[(well_df['top'] >= depth) | (well_df['btm'] >= depth)] # Iterate through rows of the filtered well dataframe for _, filtered_row in filtered_well_df.iterrows(): top = filtered_row['top'] btm = filtered_row['btm'] if depth > top and depth < btm: # Write the plug line to the content content += f'{date} squeeze {depth} {btm}\n' else :# Write the squeeze line to the content content += f'{date} squeeze {top} {btm}\n' content += "\n" # Add a newline between well sections return content def generate_tubing(df,tubing=False): content = "UNITS METRIC\n\n" # Iterate through unique well names for well_name in df['well'].unique(): content += f'DATE {df["date"].min().strftime("%Y-%m-%d")}\n' # Filter the dataframe for the current well well_df = df[df['well'] == well_name] # Get the deepest perforation depth for the current well deepest_depth = well_df['btm'].max() + 20 shallowest_depth = well_df['top'].min() - 20 # Write the casing information to the content content += f'CASING "{well_name}" "Casing 1"\n' content += '0 "C-API-6.625/J-55/20.00"\n' content += f'{deepest_depth}\n\n' if tubing: # Write the tubing information to the content content += f'TUBING "Tubing 1" "{well_name}" "{well_name}"\n' content += '0 "T-API-5.000/J-55/11.50"\n' content += f'{shallowest_depth}\n' # Write the packer information to the content content += f'PACKER "Packer 1" "{well_name}" {shallowest_depth - 30} "PK_ADD_ON1"\n\n' return content def main(): #change the page title st.set_page_config(page_title="Petrel Perforation and Tubing File Generator",layout="wide") #change the page icon st.markdown(""" """, unsafe_allow_html=True) st.title("Petrel Perforation and Tubing File Generator") # Upload Excel file uploaded_file = st.sidebar.file_uploader("Upload Perforation Excel file", type=["xlsx", "xls"]) #check box for tubing tubing = st.sidebar.checkbox("Tubing",value=False) if uploaded_file is not None: # Read the Excel file df = pd.read_excel(uploaded_file,sheet_name='perforation') plug_df = pd.read_excel(uploaded_file,sheet_name='plugs') # Create button to begin the process if st.sidebar.button("Generate"): # Prevent page refresh using a callback st.session_state.generate_clicked = True # Flag for callback # Use a callback to execute actions only when the button is clicked if st.session_state.get("generate_clicked", False): # Generate content for perforations.ev and tubing.tub perforations_content = generate_perforations(df,plug_df) tubing_content = generate_tubing(df, tubing=tubing) # Display perforations.ev content st.subheader("Click the button below to download perforations.ev and tubing.tub") # Create buttons to download files down_btn( label="Download perforations.ev", data=perforations_content, file_name="perforations.ev" ) down_btn( label="Download tubing.tub", data=tubing_content, file_name="tubing.tub" ) # Reset the flag after execution st.session_state.generate_clicked = False if __name__ == "__main__": main()