AIConnectivity / app.py
anasfsd123's picture
Create app.py
cf353e1 verified
# Install necessary libraries before running
# !pip install geopandas pycaret prophet matplotlib streamlit folium requests streamlit-folium
import streamlit as st
import pandas as pd
import numpy as np
import geopandas as gpd
import matplotlib.pyplot as plt
from prophet import Prophet
from streamlit_folium import folium_static
import folium
import os
# Function to download the naturalearth_lowres dataset
def download_naturalearth_lowres():
url = "https://naturalearth.s3.amazonaws.com/110m_cultural/ne_110m_admin_0_countries.zip"
zip_path = "ne_110m_admin_0_countries.zip"
extracted_folder = "ne_110m_admin_0_countries"
shapefile_path = os.path.join(extracted_folder, "ne_110m_admin_0_countries.shp")
if not os.path.exists(shapefile_path):
import requests
import zipfile
# Download the zip file
r = requests.get(url)
with open(zip_path, "wb") as f:
f.write(r.content)
# Extract the zip file
with zipfile.ZipFile(zip_path, "r") as zip_ref:
zip_ref.extractall(extracted_folder)
return shapefile_path
# Load Geospatial Data
@st.cache_data
def load_geospatial_data():
shapefile_path = download_naturalearth_lowres()
world = gpd.read_file(shapefile_path)
underserved_region = world[world['CONTINENT'] == 'Africa'] # Updated column name for compatibility
underserved_locations = gpd.GeoDataFrame({
"Location": ["Region A", "Region B", "Region C"],
"Latitude": [-1.2921, 1.2921, -3.2921],
"Longitude": [36.8219, 37.8219, 38.8219]
}, geometry=gpd.points_from_xy([36.8219, 37.8219, 38.8219], [-1.2921, 1.2921, -3.2921]))
return underserved_region, underserved_locations
@st.cache_data
def load_demand_data():
data = {
"date": pd.date_range(start="2022-01-01", periods=24, freq="M"),
"demand": np.random.randint(50, 200, size=24)
}
demand_df = pd.DataFrame(data)
return demand_df
underserved_region, underserved_locations = load_geospatial_data()
demand_df = load_demand_data()
# Streamlit App Title
st.title("AI-Driven Network Management for Underserved Regions")
# Sidebar for Navigation
st.sidebar.title("Navigation")
module = st.sidebar.radio("Choose a Module:", ["Overview", "Demand Forecasting", "Underserved Regions"])
# Overview
if module == "Overview":
st.subheader("Welcome to the AI-Driven Network Management App!")
st.write("""
This app provides AI-powered tools to optimize network planning and management for underserved regions.
Modules:
- **Demand Forecasting:** Predict demand for internet services over time.
- **Underserved Regions:** Identify underserved regions and visualize their locations.
""")
# Demand Forecasting Module
elif module == "Demand Forecasting":
st.subheader("Demand Forecasting")
# Prepare data for Prophet
demand_df.rename(columns={"date": "ds", "demand": "y"}, inplace=True)
# Initialize and fit Prophet model
model = Prophet()
model.fit(demand_df)
# Forecast future demand
future = model.make_future_dataframe(periods=12, freq='M')
forecast = model.predict(future)
# Plot forecast
st.write("### Historical and Forecasted Demand")
fig = model.plot(forecast)
st.pyplot(fig)
st.write("### Forecast Data")
st.dataframe(forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail(12))
# Underserved Regions Module
elif module == "Underserved Regions":
st.subheader("Underserved Regions")
# Show map with underserved regions
m = folium.Map(location=[0, 20], zoom_start=3)
# Add underserved regions
for _, row in underserved_locations.iterrows():
folium.Marker(
location=[row["Latitude"], row["Longitude"]],
popup=f"Location: {row['Location']}",
icon=folium.Icon(color="red")
).add_to(m)
st.write("### Geospatial Visualization")
folium_static(m, width=700, height=500)
# Show region data
st.write("### Region Details")
st.dataframe(underserved_locations.drop(columns="geometry"))