-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun.py
154 lines (118 loc) · 4.2 KB
/
run.py
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import pandas as pd
from Tokenize import tokenize
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
from flask import render_template, request, jsonify
from sqlalchemy import create_engine
from flask import Flask
from plotly.graph_objs import Bar
import joblib
import pickle
import plotly
import json
app = Flask(__name__)
#Load data
engine = create_engine('sqlite:///data/DisasterResponse.db')
df = pd.read_sql_table('DisasterResponse', engine)
#Load model
model = joblib.load("models/classifier.pkl")
#Index webpage displays visuals and receives user input text for model
@app.route('/')
@app.route('/index')
def index():
#Count messages for each genre
genre_counts = df.groupby('genre').count()['message']
genre_names = list(genre_counts.index)
df_categories = df[['related', 'request', 'offer', 'aid_related', 'medical_help',
'medical_products', 'search_and_rescue', 'security', 'military',
'child_alone', 'water', 'food', 'shelter', 'clothing', 'money',
'missing_people', 'refugees', 'death', 'other_aid',
'infrastructure_related', 'transport', 'buildings', 'electricity',
'tools', 'hospitals', 'shops', 'aid_centers', 'other_infrastructure',
'weather_related', 'floods', 'storm', 'fire', 'earthquake', 'cold',
'other_weather', 'direct_report']]
#Get the sum for top 10 categories
df_top_10_catg = df_categories.sum().sort_values(ascending = False).head(10).to_frame().reset_index().rename(columns={'index' :'Category', 0:'Count'})
#Get the sum for bottom 10 categories
df_tail_10_catg = df_categories.sum().sort_values(ascending = False).tail(10).to_frame().reset_index().rename(columns={'index' :'Category', 0:'Count'})
#Visuals
graphs = [
#Genres chart
{
'data': [
Bar(
x=genre_names,
y=genre_counts
)
],
'layout': {
'title': 'Distribution of Message Genres',
'yaxis': {
'title': "Count"
},
'xaxis': {
'title': "Genre"
}
}
}
,
#Categories Chart Top 10
{
'data': [
Bar(
x=df_top_10_catg['Category'],
y=df_top_10_catg['Count']
)
],
'layout': {
'title': 'Distribution of Top 10 Categories',
'yaxis': {
'title': "Count"
},
'xaxis': {
'title': "Category"
}
}
} ,
#Categories Chart Bottom 10
{
'data': [
Bar(
x=df_tail_10_catg['Category'],
y=df_tail_10_catg['Count']
)
],
'layout': {
'title': 'Distribution of Bottom 10 Categories',
'yaxis': {
'title': "Count"
},
'xaxis': {
'title': "Category"
}
}
}
]
# encode plotly graphs in JSON
ids = ["graph-{}".format(i) for i, _ in enumerate(graphs)]
graphJSON = json.dumps(graphs, cls=plotly.utils.PlotlyJSONEncoder)
# render web page with plotly graphs
return render_template('master.html', ids=ids, graphJSON=graphJSON )
# web page that handles user query and displays model results
@app.route('/go')
def go():
# save user input in query
query = request.args.get('query', '')
# use model to predict classification for query
classification_labels = model.predict([query])[0]
classification_results = dict(zip(df[df.columns[~df.columns.isin(['message' , 'id' , 'original' ,'genre'])]], classification_labels))
# This will render the go.html Please see that file.
return render_template(
'go.html',
query=query,
classification_result=classification_results
)
def main():
app.run()
if __name__ == '__main__':
main()