DhakaMetroFare / app.py
shukdevdatta123's picture
Upload 2 files
6f2e207 verified
raw
history blame
7.33 kB
import streamlit as st
import pandas as pd
import plotly.graph_objects as go
# Load the Excel file
file_path = 'Dhaka Metro Rail Fare 2.XLSX' # Ensure the correct file path
df = pd.read_excel(file_path)
# Ensure necessary columns are present
required_columns = ['Origin', 'Destination', 'Fare (৳)']
if not all(col in df.columns for col in required_columns):
st.write("Please ensure the file contains 'Origin', 'Destination', and 'Fare' columns.")
else:
# Add coordinates for each station (example coordinates for illustration)
coordinates = {
"Uttara North": (23.869066, 90.367445),
"Uttara Center": (23.860118, 90.365106),
"Uttara South": (23.845934, 90.363175),
"Pallabi": (23.82619516961383, 90.36481554252525),
"Mirpur 11": (23.819438208310213, 90.36528532902963),
"Mirpur 10": (23.808582994847285, 90.36821595330717),
"Kazipara": (23.800017952100532, 90.37178261495391),
"Shewrapara": (23.79070140857881, 90.37564622631841),
"Agargaon": (23.778385546736345, 90.3800557456356),
"Bijoy Sarani": (23.766638127271825, 90.38307537134754),
"Farmgate": (23.75923604938459, 90.38694218434738),
"Kawran Bazar": (23.751392319539104, 90.39275707447003),
"Shahbagh": (23.740324209546923, 90.39600784811131),
"Dhaka University": (23.732091083122114, 90.39659408796354),
"Bangladesh Secretariat": (23.73004754106779, 90.40764881366906),
"Motijheel": (23.72816566933198, 90.41923497972823),
"Kamalapur": (23.732367758919807, 90.42547378971085)
}
# Add latitude and longitude for origin and destination based on the coordinates dictionary
df['Origin_Lat'] = df['Origin'].map(lambda x: coordinates.get(x, (None, None))[0])
df['Origin_Lon'] = df['Origin'].map(lambda x: coordinates.get(x, (None, None))[1])
df['Destination_Lat'] = df['Destination'].map(lambda x: coordinates.get(x, (None, None))[0])
df['Destination_Lon'] = df['Destination'].map(lambda x: coordinates.get(x, (None, None))[1])
# Filter rows with missing coordinates
df.dropna(subset=['Origin_Lat', 'Origin_Lon', 'Destination_Lat', 'Destination_Lon'], inplace=True)
# Streamlit UI setup
st.title("Dhaka Metro Rail Fare Checker 🚇")
st.write("Below is the fare chart for Dhaka Metro Rail 💶:")
# Instruction sidebar
st.sidebar.title("Instructions")
st.sidebar.write("""
**Welcome to the Dhaka Metro Rail Fare Checker!**
*How to use:*
1. Select your **Location station** from the dropdown menu.
2. Select your **destination(s)** from the list. You can select multiple destinations.
3. The fare from your location to the selected destination(s) will be displayed below.
4. You can also see the stations marked on a map.
**Note:** The map highlights your location in green and destinations in blue.
If you face any issues or need further assistance, feel free to [Contact Support on WhatsApp](https://wa.me/+8801719296601).
""")
# Define the default "Select Journey from" message
default_origin = "Select Journey from"
# Dropdown for selecting origin (with "Select Journey from" as a default placeholder)
origin = st.selectbox(
"Select your Location:",
[default_origin] + df['Origin'].unique().tolist(), # Add the "Select Journey from" option at the top
index=0 # Ensure the first option is selected by default
)
# Initialize session state for destination selection if not already set
if 'destination_select' not in st.session_state:
st.session_state.destination_select = []
# Multiselect for destinations (pass the default from session state)
destinations = st.multiselect(
"Select your destination(s):",
df['Destination'].unique(),
default=st.session_state.destination_select
)
# Update session state based on the selected destinations
st.session_state.destination_select = destinations
# If the user hasn't selected a valid origin yet, don't proceed
if origin == default_origin:
st.write("Please select a valid origin station to proceed.")
elif origin and destinations:
# Filter the dataframe based on user selection
fare_data = df[(df['Origin'] == origin) & (df['Destination'].isin(destinations))]
# Display the fare data
if not fare_data.empty:
for index, row in fare_data.iterrows():
st.write(f"Fare from {origin} to {row['Destination']} is: {row['Fare (৳)']}৳")
else:
st.write("No fare data available for the selected origin and destinations.")
else:
st.write("Please select both an origin and at least one destination.")
# Plotting the map using Plotly
fig = go.Figure()
# Add markers for each unique station
unique_stations = pd.concat([df[['Origin', 'Origin_Lat', 'Origin_Lon']].rename(columns={'Origin': 'Station', 'Origin_Lat': 'Lat', 'Origin_Lon': 'Lon'}),
df[['Destination', 'Destination_Lat', 'Destination_Lon']].rename(columns={'Destination': 'Station', 'Destination_Lat': 'Lat', 'Destination_Lon': 'Lon'})]).drop_duplicates()
# Add a map marker for each station
for i, row in unique_stations.iterrows():
if row['Station'] == origin:
# Mark the origin as green
fig.add_trace(go.Scattermapbox(
mode="markers+text",
lon=[row['Lon']],
lat=[row['Lat']],
marker={'size': 12, 'color': 'green'},
text=row['Station'],
textposition="top center",
name=row['Station'],
customdata=[row['Station']] # customdata is now a list
))
elif row['Station'] in destinations:
# Mark the destination as blue
fig.add_trace(go.Scattermapbox(
mode="markers+text",
lon=[row['Lon']],
lat=[row['Lat']],
marker={'size': 12, 'color': 'blue'},
text=row['Station'],
textposition="top center",
name=row['Station'],
customdata=[row['Station']] # customdata is now a list
))
else:
# Mark all other stations as red
fig.add_trace(go.Scattermapbox(
mode="markers+text",
lon=[row['Lon']],
lat=[row['Lat']],
marker={'size': 12, 'color': 'red'},
text=row['Station'],
textposition="top center",
name=row['Station'],
customdata=[row['Station']] # customdata is now a list
))
# Map layout
fig.update_layout(
mapbox=dict(
style="open-street-map",
center=go.layout.mapbox.Center(lat=23.780, lon=90.400), # Center on Dhaka
zoom=11
),
margin={"r":0,"t":0,"l":0,"b":0},
showlegend=False,
title="Dhaka Metro Rail Location Map"
)
# Show plot in Streamlit
st.plotly_chart(fig)