from flask import Flask, render_template_string, request import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import os app = Flask(__name__) DATA_PATH = 'crime.csv' IMG_PATH = 'static/plot.png' # Load data once df = pd.read_csv(DATA_PATH) df = df[df['DISTRICT'] != 'ZZ TOTAL'] # Remove aggregate rows # Unique states and years for dropdowns states = sorted(df['STATE/UT'].unique()) years = sorted(df['YEAR'].unique()) @app.route('/', methods=['GET', 'POST']) def index(): selected_state = request.form.get('state') or states[0] selected_year = request.form.get('year') or 'All' filtered_df = df[df['STATE/UT'] == selected_state] if selected_year != 'All': filtered_df = filtered_df[filtered_df['YEAR'] == int(selected_year)] # Aggregate crimes per year (or district if single year selected) if selected_year == 'All': data_plot = filtered_df.groupby('YEAR')['TOTAL IPC CRIMES'].sum().reset_index() x, y = 'YEAR', 'TOTAL IPC CRIMES' title = f"Total IPC Crimes Over Years in {selected_state}" else: data_plot = filtered_df.groupby('DISTRICT')['TOTAL IPC CRIMES'].sum().reset_index() x, y = 'DISTRICT', 'TOTAL IPC CRIMES' title = f"Total IPC Crimes in {selected_state} ({selected_year}) by District" # Plot plt.figure(figsize=(12, 6)) sns.barplot(data=data_plot, x=x, y=y, palette='magma') plt.title(title, fontsize=14) plt.xticks(rotation=45, ha='right') plt.tight_layout() # Save plot os.makedirs('static', exist_ok=True) plt.savefig(IMG_PATH) plt.close() # HTML Template html = """ Crime Data Dashboard

Crime Data Visualization

""" return render_template_string(html, states=states, years=years, selected_state=selected_state, selected_year=selected_year) if __name__ == '__main__': app.run(host='0.0.0.0', port=7860)