-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinference_pred.py
149 lines (129 loc) · 6.92 KB
/
inference_pred.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
import sys
import pickle
import json
import pandas as pd
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QVBoxLayout,QLabel, QComboBox, QDoubleSpinBox, QPushButton, QMessageBox, QTimeEdit
from PyQt5.QtCore import QTime
from sklearn.preprocessing import LabelEncoder
class InjurySeverityPredictor(QWidget):
def __init__(self):
super().__init__()
# Load the trained model[adas_predmodel.pkl/ads_predmodel.pkl]
with open('YOUR_MODEL_FILE', 'rb') as model_file:
self.model = pickle.load(model_file)
# Define the features for prediction
self.feature_info = {
'Make': 'categorical',
'Mileage': 'numeric',
'State': 'categorical',
'Roadway Type': 'categorical',
'Roadway Surface': 'categorical',
'Roadway Description': 'categorical',
'Posted Speed Limit (MPH)': 'numeric',
'Lighting': 'categorical',
'Weather - Clear': 'categorical',
'Weather - Snow': 'categorical',
'Weather - Severe Wind': 'categorical',
'Weather - Unknown': 'categorical',
'Weather - Other': 'categorical',
'Weather - Cloudy': 'categorical',
'Weather - Rain': 'categorical',
'Weather - Fog/Smoke': 'categorical',
'SV Pre-Crash Movement': 'categorical',
'CP Pre-Crash Movement': 'categorical',
'SV Precrash Speed (MPH)': 'numeric',
'Incident Time (24:00)': 'numeric'
}
self.init_ui()
def init_ui(self):
self.setWindowTitle('Crash With?')
self.setGeometry(100, 100, 400, 300)
layout = QGridLayout()
row = 0
for feature, data_type in self.feature_info.items():
label = QLabel(feature)
widget = self.create_input_widget(data_type, feature)
setattr(self, f'{feature}_widget', widget)
layout.addWidget(label, row, 0)
if data_type == 'numeric':
row += 1
layout.addWidget(widget, row, 0, 1, 4) # span the widget across 4 columns
else:
layout.addWidget(widget, row, 1)
row += 1
predict_button = QPushButton('Predict')
predict_button.clicked.connect(self.predict)
layout.addWidget(predict_button, row, 0, 1, 4) # span the button across 4 columns
self.setLayout(layout)
self.setFixedSize(self.sizeHint()) # Make the GUI resizable
self.setMinimumSize(400, 300) # Set a minimum size
def create_input_widget(self, data_type,feature):
df['Incident Time (24:00)'] = df['Incident Time (24:00)'].fillna(0)
df['CP Pre-Crash Movement']= df['CP Pre-Crash Movement'].fillna('Unknown')
df['Mileage'] = df['Mileage'].fillna(0)
df['Posted Speed Limit (MPH)'] = df['Posted Speed Limit (MPH)'].fillna(0)
df['Weather - Clear'] = df['Weather - Clear'].replace(' ','N')
df['Weather - Snow'] = df['Weather - Snow'].replace(' ','N')
df['Weather - Cloudy'] = df['Weather - Cloudy'].replace(' ','N')
df['Weather - Rain'] = df['Weather - Rain'].replace(' ','N')
df['Weather - Fog/Smoke'] = df['Weather - Fog/Smoke'].replace(' ','N')
df['Weather - Severe Wind'] = df['Weather - Severe Wind'].replace(' ','N')
df['Weather - Unknown'] = df['Weather - Unknown'].replace(' ','N')
df['Weather - Other'] =df['Weather - Other'].replace(' ','N')
df['SV Precrash Speed (MPH)'] = df['SV Precrash Speed (MPH)'].fillna(0)
if data_type == 'categorical':
combo_box = QComboBox()
combo_box.addItems([''] + df[feature].unique().astype(str).tolist())
return combo_box
elif data_type == 'numeric' and feature != 'Incident Time (24:00)':
spin_box = QDoubleSpinBox()
spin_box.setRange(0, 150000)
return spin_box
elif feature == 'Incident Time (24:00)':
time_picker = QTimeEdit(self)
time_picker.setDisplayFormat("HH:mm")
return time_picker
def predict(self):
categorical_cols = ['Make','Mileage', 'State', 'Roadway Type', 'Roadway Surface', 'Roadway Description',
'Posted Speed Limit (MPH)', 'Lighting', 'Weather - Clear', 'Weather - Snow', 'Weather - Severe Wind', 'Weather - Unknown', 'Weather - Other',
'Weather - Cloudy', 'Weather - Rain', 'Weather - Fog/Smoke',
'SV Pre-Crash Movement','CP Pre-Crash Movement','SV Precrash Speed (MPH)','Incident Time (24:00)']
input_data = {}
for feature, data_type in self.feature_info.items():
if feature == 'Incident Time (24:00)':
time_widget = getattr(self, f'{feature}_widget')
selected_time = time_widget.time()
# input_data[feature] = selected_time.toString("HH:mm")
input_data[feature] = selected_time.hour() * 60 + selected_time.minute()
else:
widget = getattr(self, f'{feature}_widget')
input_data[feature] = widget.currentText() if data_type == 'categorical' else widget.value()
input_df = pd.DataFrame([input_data], columns=categorical_cols)
with open('integer_dict.json', 'r') as file:
integer_dict = json.load(file)
for column, mapping in integer_dict.items():
if column != 'Crash With':
input_df[column] = input_df[column].map(mapping)
print(input_df)
try:
prediction_int = self.model.predict(input_df)[0]
crash_with_dict = integer_dict.get('Crash With')
prediction=[key for key, value in crash_with_dict.items() if value == prediction_int][0]
print(prediction)
QMessageBox.information(self, 'Prediction', f'Crash With: {prediction}')
except Exception as e:
QMessageBox.warning(self, 'Error', f'Error during prediction: {str(e)}')
if __name__ == '__main__':
app = QApplication(sys.argv)
df = pd.read_csv('YOUR_DATA_FILE.csv') #ADS/ADAS
categorical_cols = ['Make','Mileage', 'State', 'Roadway Type', 'Roadway Surface', 'Roadway Description',
'Posted Speed Limit (MPH)', 'Lighting', 'Weather - Clear', 'Weather - Snow', 'Weather - Severe Wind', 'Weather - Unknown', 'Weather - Other',
'Weather - Cloudy', 'Weather - Rain', 'Weather - Fog/Smoke',
'SV Pre-Crash Movement','CP Pre-Crash Movement','SV Precrash Speed (MPH)','Incident Time (24:00)']
df = df[categorical_cols]
df['Incident Time (24:00)']= df['Incident Time (24:00)'].replace(' ','00:00')
df['Incident Time (24:00)'] = pd.to_datetime(df['Incident Time (24:00)'], format='%H:%M')
df['Incident Time (24:00)'] = df['Incident Time (24:00)'].dt.hour * 60 + df['Incident Time (24:00)'].dt.minute
window = InjurySeverityPredictor()
window.show()
sys.exit(app.exec_())