Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #import flask and required functions
- from flask import Flask, render_template, request
- #import pandas
- import pandas as pd
- #standar library imports
- import contextlib
- import errno
- import os
- import sys
- import warnings
- #import bokeh components
- from bokeh.embed import server_document,components
- from bokeh.layouts import column,widgetbox
- from bokeh.models import ColumnDataSource,HoverTool,GMapPlot, GMapOptions, ColumnDataSource, Circle, DataRange1d, Select
- from bokeh.server.server import Server
- from tornado.ioloop import IOLoop
- from bokeh.io import curdoc
- from bokeh.plotting import *
- from bokeh.application import Application
- from bokeh.application.handlers import ScriptHandler, DirectoryHandler, NotebookHandler
- #define flask application
- app = Flask(__name__)
- def build_single_handler_applications(paths, argvs=None):
- applications = {}
- argvs = {} or argvs
- for path in paths:
- application = build_single_handler_application(path, argvs.get(path, []))
- route = application.handlers[0].url_path()
- if not route:
- if '/' in applications:
- raise RuntimeError("Don't know the URL path to use for %s" % (path))
- route = '/'
- applications[route] = application
- return applications
- #addmod map function
- def modMap(doc):
- #open excel file
- file = pd.ExcelFile("C:\\Users\\Dell1525\\Desktop\\project\\dataset3Geo.xlsx",parse_dates=['Year'])
- #parse the first sheet in ecel file
- dataset2 = file.parse('Sheet1')
- #formate date comlumn
- dataset2['Year'] = pd.to_datetime(dataset2['Year']).apply(lambda x:x.strftime('%Y'))
- #create data source for column data
- dataPoints = ColumnDataSource(data=dataset2)
- #add tools and map options
- tools='pan','wheel_zoom','reset','hover'
- map_options = GMapOptions(lat=54.794953, lng=-6.817343, map_type='roadmap', zoom=8)
- api_key = ''
- #create plot on gmap
- p = gmap(api_key, map_options, title="Crime Map of Northern Ireland",tools=tools)
- r = p.circle(x="Long", y="Lat", size=15, fill_color="blue", fill_alpha=0.8, source=dataPoints)
- #create simple selection widgets
- selecYear = Select(options = ['2017','2016','2015','2014','2013','2012','2011','2010','2009','2008','2007','2006','2005','2004','2003','2002','2001'],value = '2017', title = 'Select The Year ')
- crimeSelect = Select(options = ['All Cimes','Violent Offences','Burglary','Theft','Criminal Damage','Drug Offences','Other Offences'],value='Violence with injury',title='Select Crime:')
- #perform exploratory data analysis based on users input
- def select_callback(attr, old,new):
- selectedYear = selecYear.value
- selectedCrime = crimeSelect.value
- if selecYear.value == selectedYear or crimeSelect.value == selectedCrime:
- newYear = dataset2[dataset2['Year'] == selectedYear]
- newCrimesinYear = newYear[newYear['CrimeType'] == selectedCrime]
- newdata = ColumnDataSource(newCrimesinYear)
- r.data_source.data=newdata.data
- #add new data hover tooltips
- p.hover.tooltips=[('Year','@Year'),('Area','@Area'),('CrimeType','@CrimeType'),('Recorded Offences','@RecordedOffences')]
- selecYear.on_change('value',select_callback)
- crimeSelect.on_change('value',select_callback)
- #add elements to application
- doc.add_root(selectedYear,selectedCrime,p)
- #create main timeseries plot
- def modifyTimeSeries(doc):
- #import pandas for data management
- import pandas as pd
- #open excel file
- file = pd.ExcelFile("C:\\Users\\Dell1525\\Desktop\\project\\newdataset2.xlsx",parse_dates=['Date'])
- #parse the first sheet in ecel file
- dataset2 = file.parse('Sheet1')
- #create data source for column data
- dataPoints = ColumnDataSource(dataset2)
- #create default chart and line
- p = figure(title= "Recorded Crimes Sep 2016 to Aug 2018", y_axis_type="linear",x_axis_type="datetime",
- plot_height=500,plot_width=500)
- p.line(x = 'Date', y = 'RecordedOffences', source = dataPoints, color = 'red')
- #callback method which will change slider values
- def callback(attr, old,new):
- selectedTown = select_widget1.value
- selectedCrime = select_widget2.value
- if select_widget1.value == selectedTown or select_widget2.value == selectedCrime:
- newTown = dataset2[dataset2['PolicingDistrict'] == selectedTown]
- newCrimeinTown = newTown[newTown['CrimeType'] == selectedCrime]
- #column data source for plot
- dataPoints.data = ColumnDataSource(newCrimeinTown).data
- select_widget1 = Select(options = ['Belfast','Lisburn','Ards','Newry','Armagh','Dungannon','Omagh','Londonderry','Antrim','Newtownabbey'],value = 'Belfast', title = 'Select Policing District ')
- select_widget2 = Select(options = ['Violence with injury','Violence without injury','Sexual offences','Robbery','Criminal damage','Trafficking of drugs','Possession of drugs','Possession of weapons','Public order offences'],value = 'Violence with injury', title = 'Select Crime Type')
- doc.add_root(column(slider_widget1,slider_widget2, p))
- files=[]
- for file in os.listdir("bokeh"):
- if file.endswith('.py'):
- file="map"+file
- files.append(file)
- argvs = {}
- urls = []
- for i in files:
- argvs[i] = None
- urls.append(i.split('\\')[-1].split('.')[0])
- host = 'http://localhost:5006/map'
- apps = build_single_handler_applications(files, argvs)
- bokeh_tornado = BokehTornado(apps, extra_websocket_origins=["localhost:8000"])
- bokeh_http = HTTPServer(bokeh_tornado)
- sockets, port = bind_sockets("localhost:8000", 5000)
- bokeh_http.add_sockets(sockets)
- #add navigation
- @app.route("/")
- #add another route for easier access to index
- @app.route("/home")
- def index():
- return render_template('index.html')
- @app.route("/predict")
- def predictions():
- return "<h1>Predictions Based on PSNI Collected Data</h1>"
- @app.route("/analysis")
- def analysis():
- #get features
- return render_template('data.html')
- @app.route("/analysis/timeSeries",methods=['GET'])
- def getTimePlot():
- script = server_document('http://localhost:5006/timeseries')
- return render_template("displaytimeseries.html", script=script, template="Flask")
- def startPlotserver():
- server.start()
- server = Server({'/timeseries': modifyTimeSeries}, io_loop=IOLoop(), allow_websocket_origin=["localhost:8000"])
- server.io_loop.start()
- if __name__ == '__main__':
- print('Opening single process Flask app with embedded Bokeh application on http://localhost:8000/')
- print()
- print('Multiple connections may block the Bokeh app in this configuration!')
- print('See "flask_gunicorn_embed.py" for one way to run multi-process')
- app.run(port=5000, debug=True)
- @app.route('/crimeMap', methods=['GET'])
- def getCrimeMap():
- bokeh_script = server_document("http://localhost:5006:%d/map" % port)
- return render_template("displaymap1.html", bokeh_script=bokeh_script)
- #while script is running directly run the app
- if __name__ == "__main__":
- app.run(debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement