kph / app.py
BSJ2004's picture
Rename model.py to app.py
2e45e64 verified
raw
history blame
No virus
3.96 kB
import streamlit as st
import pandas as pd
import numpy as np
from geopy.distance import geodesic
from sklearn.cluster import KMeans
# Load the dataset
@st.cache_data
def load_data():
file_path = r"C:\Users\hp\Desktop\project\predictive crime\preprocessed_df1.csv" # Update with your file path
return pd.read_csv(file_path, low_memory=False)
# Function to calculate distance between two coordinates
def calculate_distance(coord1, coord2):
return geodesic(coord1, coord2).km
# Function to generate deployment plan
def generate_deployment_plan(df, centroids):
deployment_plan = {}
for cluster in centroids.keys():
cluster_data = df[df['Cluster'] == cluster]
number_of_incidents = len(cluster_data)
suggestions = ""
if number_of_incidents == 0:
suggestions = "Increase police presence and conduct thorough investigations to prevent future incidents."
elif number_of_incidents <= 10:
suggestions = "Continue monitoring the area and conduct periodic patrols to maintain security."
else:
suggestions = "<span style='color:red;font-weight:bold'>Intensify surveillance efforts</span> and consider implementing community policing strategies."
deployment_plan[cluster] = {
'cluster_centroid': centroids[cluster],
'number_of_incidents': number_of_incidents,
'suggestions': suggestions
}
return deployment_plan
# Function to predict the number of incidents based on input latitude and longitude
def predict_incidents(input_latitude, input_longitude, df, centroids):
offense_location = (input_latitude, input_longitude)
closest_centroid = min(centroids.keys(), key=lambda x: calculate_distance(offense_location, (centroids[x]['Latitude'], centroids[x]['Longitude'])))
return closest_centroid
# Streamlit app
def main():
st.title("Crime Deployment Plan")
# Load the data
df = load_data()
# Preprocessing
df = df[(df['Latitude'] != 0.0) & (df['Longitude'] != 0.0)]
# Clustering
features = ['Latitude', 'Longitude']
X = df[features]
X = (X - X.mean()) / X.std()
kmeans = KMeans(n_clusters=5, random_state=42)
df['Cluster'] = kmeans.fit_predict(X)
# Define the latitude and longitude of the cluster centroids
centroids = {
1: {'Latitude': -0.26350117329990513, 'Longitude': 0.20905869782346226},
2: {'Latitude': 5.807340212426832, 'Longitude': -5.187200322116295},
3: {'Latitude': -1.2370956602478118, 'Longitude': -5.921660553559399},
4: {'Latitude': -0.2676250405697857, 'Longitude': 59.52073073890124},
5: {'Latitude': 0.023547431083855475, 'Longitude': 0.09870306054587759}
}
# User input for latitude and longitude
st.header("Input Latitude and Longitude")
input_latitude = st.number_input("Latitude", value=0.0)
input_longitude = st.number_input("Longitude", value=0.0)
# Button to trigger the calculation
if st.button("Predict and Generate Suggestions"):
# Predict the cluster and get suggestions
cluster_prediction = predict_incidents(input_latitude, input_longitude, df, centroids)
deployment_plan = generate_deployment_plan(df, centroids)
suggestions = deployment_plan[cluster_prediction]['suggestions']
# Calculate the number of incidents based on input value
offense_location = (input_latitude, input_longitude)
closest_centroid_data = df[df['Cluster'] == cluster_prediction]
number_of_incidents = len(closest_centroid_data)
# Display suggestions and number of incidents
col1, col2 = st.columns(2)
with col1:
st.subheader("Suggestions")
st.markdown(suggestions, unsafe_allow_html=True)
with col2:
st.subheader("Number of Incidents")
st.write(number_of_incidents)
if __name__ == "__main__":
main()