File size: 3,956 Bytes
e4c4709
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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()