import streamlit as st import pandas as pd import bisect def binary_search_nearest(df, target): """Find the nearest values using binary search.""" application_numbers = df['Application Number'].tolist() pos = bisect.bisect_left(application_numbers, target) # Find the nearest neighbors before = application_numbers[pos - 1] if pos > 0 else None after = application_numbers[pos] if pos < len(application_numbers) else None return before, after def search_application(df): user_input = st.text_input("Enter your Application Number (including IRL if applicable):") if user_input: # Validate input if "irl" in user_input.lower(): try: application_number = int("".join(filter(str.isdigit, user_input.lower().split("irl")[-1]))) if len(str(application_number)) < 8: st.warning("Please enter a valid application number with at least 8 digits after IRL.") return except ValueError: st.error("Invalid input after IRL. Please enter only digits.") return else: if not user_input.isdigit() or len(user_input) < 8: st.warning("Please enter at least 8 digits for your VISA application number.") return elif len(user_input) > 8: st.warning("The application number cannot exceed 8 digits. Please correct your input.") return application_number = int(user_input) # Search for the application number result = df[df['Application Number'] == application_number] if not result.empty: decision = result.iloc[0]['Decision'] if decision.lower() == 'refused': st.error(f"Application Number: {application_number}\n\nDecision: **Refused**") elif decision.lower() == 'approved': st.success(f"Application Number: {application_number}\n\nDecision: **Approved**") else: st.info(f"Application Number: {application_number}\n\nDecision: **{decision}**") else: st.warning(f"No record found for Application Number: {application_number}.") # Find nearest application numbers using binary search before, after = binary_search_nearest(df, application_number) # Display nearest records nearest_records = pd.DataFrame({ "Nearest Application": ["Before", "After"], "Application Number": [before, after], "Decision": [ df[df['Application Number'] == before]['Decision'].values[0] if before else None, df[df['Application Number'] == after]['Decision'].values[0] if after else None ], "Difference": [ application_number - before if before else None, after - application_number if after else None ] }).dropna() if not nearest_records.empty: st.subheader("Nearest Application Numbers") st.table(nearest_records.reset_index(drop=True)) else: st.info("No nearest application numbers found.")