Spaces:
Sleeping
Sleeping
Ubuntu commited on
Commit Β·
1468869
1
Parent(s): 5507b03
added items
Browse files- core/config.py +1472 -61
- core/matcher.py +10 -14
- ui/interface.py +55 -23
- ui/tabs/detailed_tab.py +26 -18
- ui/tabs/simple_search_tab.py +57 -32
- ui/tabs/simple_tab.py +8 -6
- ui/tabs/traditional_tab.py +57 -30
- utils/helpers.py +16 -1
core/config.py
CHANGED
|
@@ -15,170 +15,1581 @@ SIMPLE_MODEL_PATH = "./simple_autogluon_models"
|
|
| 15 |
DATA_DIR = "./data"
|
| 16 |
|
| 17 |
# Define structured make-model data for dynamic dropdowns
|
|
|
|
| 18 |
MAKE_MODEL_DATA = {
|
| 19 |
-
"
|
| 20 |
-
"
|
| 21 |
-
"
|
| 22 |
-
"
|
| 23 |
-
"
|
| 24 |
-
"
|
| 25 |
-
"
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
"
|
| 29 |
-
"
|
| 30 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
],
|
| 32 |
"Audi": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
"Q3",
|
| 34 |
-
"
|
| 35 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
],
|
| 37 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
"125I",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
"5",
|
| 40 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
],
|
| 42 |
"Fiat": [
|
| 43 |
"500",
|
| 44 |
"500C",
|
| 45 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
],
|
| 47 |
"Ford": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
"Everest",
|
|
|
|
|
|
|
|
|
|
| 49 |
"F150",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
"Falcon",
|
|
|
|
| 51 |
"Fiesta",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
"Ranger",
|
| 53 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
],
|
| 55 |
-
"
|
| 56 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
],
|
| 58 |
"Great Wall": [
|
| 59 |
-
"Steed"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
],
|
| 61 |
"Holden": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
"Calais",
|
|
|
|
| 63 |
"Captiva",
|
|
|
|
| 64 |
"Colorado",
|
| 65 |
"Colorado 7",
|
|
|
|
| 66 |
"Commodore",
|
|
|
|
| 67 |
"Cruze",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
"Trax",
|
| 69 |
-
"
|
|
|
|
|
|
|
|
|
|
| 70 |
],
|
| 71 |
"Honda": [
|
| 72 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
],
|
| 74 |
"Hyundai": [
|
| 75 |
"Accent",
|
| 76 |
"Elantra",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
"I30",
|
| 78 |
-
"
|
|
|
|
| 79 |
"Iload",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
"Kona",
|
| 81 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
"Tucson",
|
| 83 |
-
"Veloster"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
],
|
| 85 |
"Isuzu": [
|
| 86 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
],
|
| 88 |
"Jaguar": [
|
| 89 |
-
"E
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
],
|
| 91 |
"Jeep": [
|
| 92 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
],
|
| 94 |
"Kia": [
|
|
|
|
| 95 |
"Cerato",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
"Optima",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
"Sorento",
|
| 98 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
],
|
| 100 |
-
"
|
| 101 |
-
"
|
| 102 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
],
|
| 104 |
"Land Rover": [
|
| 105 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 106 |
],
|
| 107 |
-
"
|
| 108 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
],
|
| 110 |
"Mazda": [
|
|
|
|
|
|
|
|
|
|
| 111 |
"3",
|
|
|
|
| 112 |
"6",
|
| 113 |
-
"
|
| 114 |
-
"
|
| 115 |
-
"
|
| 116 |
-
"
|
| 117 |
-
"
|
| 118 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 119 |
],
|
| 120 |
"Mercedes-Benz": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
"C180",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
"C250",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
"E350",
|
| 124 |
-
"
|
| 125 |
-
"
|
| 126 |
-
"
|
| 127 |
-
"
|
| 128 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
],
|
| 130 |
"Mini": [
|
| 131 |
-
"3D Hatch"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
],
|
| 133 |
"Mitsubishi": [
|
| 134 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
"Eclipse Cross",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
"Lancer",
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
"Outlander",
|
|
|
|
|
|
|
| 138 |
"Pajero Sport",
|
| 139 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
],
|
| 141 |
"Nissan": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 142 |
"Maxima",
|
|
|
|
|
|
|
| 143 |
"Navara",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
"Pathfinder",
|
| 145 |
"Patrol",
|
|
|
|
| 146 |
"Qashqai",
|
|
|
|
|
|
|
|
|
|
| 147 |
"Skyline",
|
| 148 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
],
|
| 150 |
"Porsche": [
|
|
|
|
|
|
|
|
|
|
|
|
|
| 151 |
"Cayenne",
|
| 152 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 153 |
],
|
| 154 |
"Renault": [
|
|
|
|
| 155 |
"Captur",
|
| 156 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 157 |
],
|
| 158 |
"Skoda": [
|
| 159 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 160 |
],
|
| 161 |
"Subaru": [
|
|
|
|
|
|
|
|
|
|
| 162 |
"Forester",
|
| 163 |
"Impreza",
|
|
|
|
|
|
|
| 164 |
"Liberty",
|
| 165 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 166 |
],
|
| 167 |
"Suzuki": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 168 |
"Jimny",
|
| 169 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 170 |
],
|
| 171 |
"Volkswagen": [
|
| 172 |
"Amarok",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
"Golf",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 174 |
"Polo",
|
| 175 |
-
"
|
| 176 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 177 |
],
|
| 178 |
"Volvo": [
|
| 179 |
-
"
|
| 180 |
-
"
|
| 181 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 182 |
}
|
| 183 |
|
| 184 |
# Extract makes list for dropdown
|
|
|
|
| 15 |
DATA_DIR = "./data"
|
| 16 |
|
| 17 |
# Define structured make-model data for dynamic dropdowns
|
| 18 |
+
# Auto-generated MAKE_MODEL_DATA from extract_makes_models_clean.py
|
| 19 |
MAKE_MODEL_DATA = {
|
| 20 |
+
"Abarth": [
|
| 21 |
+
"124",
|
| 22 |
+
"500",
|
| 23 |
+
"500E",
|
| 24 |
+
"595",
|
| 25 |
+
"595C",
|
| 26 |
+
"695",
|
| 27 |
+
],
|
| 28 |
+
"Alfa Romeo": [
|
| 29 |
+
"147",
|
| 30 |
+
"156",
|
| 31 |
+
"159",
|
| 32 |
+
"4C",
|
| 33 |
+
"Brera",
|
| 34 |
+
"Giulia",
|
| 35 |
+
"Giulietta",
|
| 36 |
+
"Gt",
|
| 37 |
+
"Mito",
|
| 38 |
+
"Spider",
|
| 39 |
+
"Stelvio",
|
| 40 |
+
"Tonale",
|
| 41 |
+
],
|
| 42 |
+
"Alpine": [
|
| 43 |
+
"110",
|
| 44 |
+
],
|
| 45 |
+
"Aston Martin": [
|
| 46 |
+
"Db7",
|
| 47 |
+
"Db9",
|
| 48 |
+
"Dbx",
|
| 49 |
+
"Rapide",
|
| 50 |
+
"V8",
|
| 51 |
+
"Vantage",
|
| 52 |
+
],
|
| 53 |
+
"Atlantic Caravans": [
|
| 54 |
+
"Columbus",
|
| 55 |
],
|
| 56 |
"Audi": [
|
| 57 |
+
"A1",
|
| 58 |
+
"A3",
|
| 59 |
+
"A4",
|
| 60 |
+
"A5",
|
| 61 |
+
"A6",
|
| 62 |
+
"A7",
|
| 63 |
+
"A8",
|
| 64 |
+
"Allroad Quattro",
|
| 65 |
+
"E-Tron",
|
| 66 |
+
"Q2",
|
| 67 |
"Q3",
|
| 68 |
+
"Q4 E-Tron",
|
| 69 |
+
"Q5",
|
| 70 |
+
"Q7",
|
| 71 |
+
"Q8",
|
| 72 |
+
"R8",
|
| 73 |
+
"Rs 3",
|
| 74 |
+
"Rs 4",
|
| 75 |
+
"Rs 5",
|
| 76 |
+
"Rs 6",
|
| 77 |
+
"Rs 7",
|
| 78 |
+
"Rs Q3",
|
| 79 |
+
"Rs Q8",
|
| 80 |
+
"Rs3",
|
| 81 |
+
"Rs4",
|
| 82 |
+
"Rs5",
|
| 83 |
+
"Rs6",
|
| 84 |
+
"S1",
|
| 85 |
+
"S3",
|
| 86 |
+
"S4",
|
| 87 |
+
"S5",
|
| 88 |
+
"S6",
|
| 89 |
+
"S7",
|
| 90 |
+
"S8",
|
| 91 |
+
"Sq2",
|
| 92 |
+
"Sq5",
|
| 93 |
+
"Sq5 Plus",
|
| 94 |
+
"Sq7",
|
| 95 |
+
"Sq8",
|
| 96 |
+
"Sq8 E-Tron",
|
| 97 |
+
"Tt",
|
| 98 |
],
|
| 99 |
+
"Bentley": [
|
| 100 |
+
"Bentayga",
|
| 101 |
+
"Continental",
|
| 102 |
+
"Flying Spur",
|
| 103 |
+
"Mulsanne",
|
| 104 |
+
"S2",
|
| 105 |
+
],
|
| 106 |
+
"Bmw": [
|
| 107 |
+
"1",
|
| 108 |
+
"1 Series",
|
| 109 |
+
"116I",
|
| 110 |
+
"118D",
|
| 111 |
+
"118I",
|
| 112 |
+
"120I",
|
| 113 |
+
"123D",
|
| 114 |
"125I",
|
| 115 |
+
"128Ti",
|
| 116 |
+
"130I",
|
| 117 |
+
"2",
|
| 118 |
+
"2 Series",
|
| 119 |
+
"218D",
|
| 120 |
+
"218I",
|
| 121 |
+
"220D",
|
| 122 |
+
"220I",
|
| 123 |
+
"225I",
|
| 124 |
+
"228I",
|
| 125 |
+
"230I",
|
| 126 |
+
"3",
|
| 127 |
+
"3 Series",
|
| 128 |
+
"316I",
|
| 129 |
+
"318D",
|
| 130 |
+
"318I",
|
| 131 |
+
"318Is",
|
| 132 |
+
"320D",
|
| 133 |
+
"320I",
|
| 134 |
+
"323",
|
| 135 |
+
"323Ci",
|
| 136 |
+
"323I",
|
| 137 |
+
"325Ci",
|
| 138 |
+
"325I",
|
| 139 |
+
"328I",
|
| 140 |
+
"328I Gt",
|
| 141 |
+
"330Ci",
|
| 142 |
+
"330D",
|
| 143 |
+
"330I",
|
| 144 |
+
"335I",
|
| 145 |
+
"340I",
|
| 146 |
+
"4",
|
| 147 |
+
"420D",
|
| 148 |
+
"420I",
|
| 149 |
+
"428I",
|
| 150 |
+
"430I",
|
| 151 |
+
"435I",
|
| 152 |
+
"440I",
|
| 153 |
"5",
|
| 154 |
+
"5 Series",
|
| 155 |
+
"520D",
|
| 156 |
+
"520I",
|
| 157 |
+
"525E",
|
| 158 |
+
"525I",
|
| 159 |
+
"528I",
|
| 160 |
+
"530D",
|
| 161 |
+
"530I",
|
| 162 |
+
"535D",
|
| 163 |
+
"535I",
|
| 164 |
+
"540I",
|
| 165 |
+
"550I",
|
| 166 |
+
"6",
|
| 167 |
+
"620D",
|
| 168 |
+
"630I",
|
| 169 |
+
"640I",
|
| 170 |
+
"645Ci",
|
| 171 |
+
"650Ci",
|
| 172 |
+
"650I",
|
| 173 |
+
"7",
|
| 174 |
+
"730D",
|
| 175 |
+
"735I",
|
| 176 |
+
"740I",
|
| 177 |
+
"750I",
|
| 178 |
+
"8 Series",
|
| 179 |
+
"840I",
|
| 180 |
+
"850I",
|
| 181 |
+
"I3",
|
| 182 |
+
"I4",
|
| 183 |
+
"I5",
|
| 184 |
+
"I8",
|
| 185 |
+
"Ix",
|
| 186 |
+
"Ix1",
|
| 187 |
+
"Ix2",
|
| 188 |
+
"Ix3",
|
| 189 |
+
"M",
|
| 190 |
+
"M135I",
|
| 191 |
+
"M140I",
|
| 192 |
+
"M2",
|
| 193 |
+
"M235I",
|
| 194 |
+
"M240I",
|
| 195 |
+
"M3",
|
| 196 |
+
"M4",
|
| 197 |
+
"M440I",
|
| 198 |
+
"M5",
|
| 199 |
+
"M6",
|
| 200 |
+
"M850I",
|
| 201 |
+
"Other",
|
| 202 |
+
"X1",
|
| 203 |
+
"X2",
|
| 204 |
+
"X3",
|
| 205 |
+
"X4",
|
| 206 |
+
"X5",
|
| 207 |
+
"X6",
|
| 208 |
+
"X7",
|
| 209 |
+
"Xm",
|
| 210 |
+
"Z3",
|
| 211 |
+
"Z4",
|
| 212 |
+
],
|
| 213 |
+
"Bmw Alpina": [
|
| 214 |
+
"Xb7",
|
| 215 |
+
],
|
| 216 |
+
"Bncu": [
|
| 217 |
+
"Drifter",
|
| 218 |
+
],
|
| 219 |
+
"Bobcat": [
|
| 220 |
+
"463",
|
| 221 |
+
],
|
| 222 |
+
"Boeing Trailer": [
|
| 223 |
+
"Boeing",
|
| 224 |
+
],
|
| 225 |
+
"Brabham": [
|
| 226 |
+
"Bt16",
|
| 227 |
+
],
|
| 228 |
+
"Byd": [
|
| 229 |
+
"Atto 3",
|
| 230 |
+
"Dolphin",
|
| 231 |
+
"E6",
|
| 232 |
+
"Seal",
|
| 233 |
+
],
|
| 234 |
+
"Cadillac": [
|
| 235 |
+
"De Ville",
|
| 236 |
+
"Eldorado",
|
| 237 |
+
],
|
| 238 |
+
"Camel Camper Trailer": [
|
| 239 |
+
"Nomad",
|
| 240 |
+
],
|
| 241 |
+
"Carribean": [
|
| 242 |
+
"Jaguar",
|
| 243 |
+
],
|
| 244 |
+
"Chery": [
|
| 245 |
+
"J11",
|
| 246 |
+
"J3",
|
| 247 |
+
"Omoda 5",
|
| 248 |
+
"Omoda5",
|
| 249 |
+
"Tiggo 7 Pro",
|
| 250 |
+
"Tiggo 8 Pro Max",
|
| 251 |
+
],
|
| 252 |
+
"Chevrolet": [
|
| 253 |
+
"Bel Air",
|
| 254 |
+
"Camaro",
|
| 255 |
+
"Corvette",
|
| 256 |
+
"El Camino",
|
| 257 |
+
"Fleetline",
|
| 258 |
+
"Silverado",
|
| 259 |
+
"Silverado Hd",
|
| 260 |
+
],
|
| 261 |
+
"Chrysler": [
|
| 262 |
+
"300",
|
| 263 |
+
"300C",
|
| 264 |
+
"Crossfire",
|
| 265 |
+
"Gladiator",
|
| 266 |
+
"Grand Voyager",
|
| 267 |
+
"Pt Cruiser",
|
| 268 |
+
"Regal",
|
| 269 |
+
"Sebring",
|
| 270 |
+
"Valiant",
|
| 271 |
+
],
|
| 272 |
+
"Citroen": [
|
| 273 |
+
"Berlingo",
|
| 274 |
+
"Berlingo Ii",
|
| 275 |
+
"C2",
|
| 276 |
+
"C3",
|
| 277 |
+
"C4",
|
| 278 |
+
"C4 Cactus",
|
| 279 |
+
"C4 Picasso",
|
| 280 |
+
"C5",
|
| 281 |
+
"C5 Aircross",
|
| 282 |
+
"Ds3",
|
| 283 |
+
"Ds4",
|
| 284 |
+
"Ds5",
|
| 285 |
+
"Grand C4",
|
| 286 |
+
"Grand C4 Picasso",
|
| 287 |
+
"Xsara",
|
| 288 |
+
],
|
| 289 |
+
"Crownline": [
|
| 290 |
+
"19Ss",
|
| 291 |
+
],
|
| 292 |
+
"Cupra": [
|
| 293 |
+
"Ateca",
|
| 294 |
+
"Born",
|
| 295 |
+
"Formentor",
|
| 296 |
+
"Leon",
|
| 297 |
+
],
|
| 298 |
+
"Daewoo": [
|
| 299 |
+
"Lanos",
|
| 300 |
+
],
|
| 301 |
+
"Daihatsu": [
|
| 302 |
+
"Atrai",
|
| 303 |
+
"Charade",
|
| 304 |
+
"Copen",
|
| 305 |
+
"Cuore",
|
| 306 |
+
"Hi Jet",
|
| 307 |
+
"Hi-Jet",
|
| 308 |
+
"Hijet",
|
| 309 |
+
"Midget Ii",
|
| 310 |
+
"Rocky",
|
| 311 |
+
"Taft",
|
| 312 |
+
"Terios",
|
| 313 |
+
],
|
| 314 |
+
"Daimler": [
|
| 315 |
+
"250",
|
| 316 |
+
"Sovereign",
|
| 317 |
+
],
|
| 318 |
+
"Datsun": [
|
| 319 |
+
"1200",
|
| 320 |
+
"Stanza",
|
| 321 |
+
],
|
| 322 |
+
"De Tomaso": [
|
| 323 |
+
"Longchamp",
|
| 324 |
+
],
|
| 325 |
+
"Dodge": [
|
| 326 |
+
"Caliber",
|
| 327 |
+
"Challenger",
|
| 328 |
+
"Journey",
|
| 329 |
+
"Nitro",
|
| 330 |
+
"Ram",
|
| 331 |
+
"Viper",
|
| 332 |
+
],
|
| 333 |
+
"Ducati": [
|
| 334 |
+
"Hypermotard 821",
|
| 335 |
+
],
|
| 336 |
+
"Easytow": [
|
| 337 |
+
"Trailer",
|
| 338 |
+
],
|
| 339 |
+
"Eunos": [
|
| 340 |
+
"30",
|
| 341 |
+
"30X",
|
| 342 |
+
],
|
| 343 |
+
"Ferrari": [
|
| 344 |
+
"328",
|
| 345 |
+
"348",
|
| 346 |
+
"360",
|
| 347 |
+
"458",
|
| 348 |
+
"488",
|
| 349 |
+
"California",
|
| 350 |
+
"F355",
|
| 351 |
+
"F430",
|
| 352 |
+
"F8 Tributo",
|
| 353 |
+
"Gtc4",
|
| 354 |
+
"Mondial",
|
| 355 |
+
"Roma",
|
| 356 |
+
"Superamerica",
|
| 357 |
],
|
| 358 |
"Fiat": [
|
| 359 |
"500",
|
| 360 |
"500C",
|
| 361 |
+
"500E",
|
| 362 |
+
"500X",
|
| 363 |
+
"Doblo",
|
| 364 |
+
"Ducato",
|
| 365 |
+
"Freemont",
|
| 366 |
+
"Panda",
|
| 367 |
+
"Punto",
|
| 368 |
+
"Ritmo",
|
| 369 |
+
"Scudo",
|
| 370 |
+
],
|
| 371 |
+
"Flight Craft": [
|
| 372 |
+
"Flight Craft By Malibu",
|
| 373 |
],
|
| 374 |
"Ford": [
|
| 375 |
+
"Bronco",
|
| 376 |
+
"Courier",
|
| 377 |
+
"E-Transit",
|
| 378 |
+
"Econovan",
|
| 379 |
+
"Ecosport",
|
| 380 |
+
"Endura",
|
| 381 |
+
"Escape",
|
| 382 |
"Everest",
|
| 383 |
+
"Explorer",
|
| 384 |
+
"F -150",
|
| 385 |
+
"F100",
|
| 386 |
"F150",
|
| 387 |
+
"F150 Lariat",
|
| 388 |
+
"F250",
|
| 389 |
+
"F350",
|
| 390 |
+
"F450",
|
| 391 |
+
"Fairlane",
|
| 392 |
+
"Fairmont",
|
| 393 |
"Falcon",
|
| 394 |
+
"Festiva",
|
| 395 |
"Fiesta",
|
| 396 |
+
"Focus",
|
| 397 |
+
"Fpv",
|
| 398 |
+
"G6",
|
| 399 |
+
"Ka",
|
| 400 |
+
"Kuga",
|
| 401 |
+
"Laser",
|
| 402 |
+
"Ltd",
|
| 403 |
+
"Mondeo",
|
| 404 |
+
"Mustang",
|
| 405 |
+
"Puma",
|
| 406 |
"Ranger",
|
| 407 |
+
"Telstar",
|
| 408 |
+
"Territory",
|
| 409 |
+
"Transit",
|
| 410 |
+
"Transit Custom",
|
| 411 |
+
"Transit Van",
|
| 412 |
+
],
|
| 413 |
+
"Foton": [
|
| 414 |
+
"Aumark",
|
| 415 |
+
"Sauvana",
|
| 416 |
+
"Tunland",
|
| 417 |
+
"View Cs2",
|
| 418 |
+
],
|
| 419 |
+
"Fpv": [
|
| 420 |
+
"F6",
|
| 421 |
+
"Gs",
|
| 422 |
+
"Gt",
|
| 423 |
+
"Gt-P",
|
| 424 |
+
"Super Pursuit",
|
| 425 |
+
],
|
| 426 |
+
"Fuso": [
|
| 427 |
+
"Canter",
|
| 428 |
+
"Fighter",
|
| 429 |
+
],
|
| 430 |
+
"Genesis": [
|
| 431 |
+
"G70",
|
| 432 |
+
"G80",
|
| 433 |
+
"Gv70",
|
| 434 |
+
"Gv80",
|
| 435 |
],
|
| 436 |
+
"Gmc": [
|
| 437 |
+
"3500",
|
| 438 |
+
"Other",
|
| 439 |
+
"Sierra",
|
| 440 |
+
],
|
| 441 |
+
"Gmsv": [
|
| 442 |
+
"Corvette",
|
| 443 |
],
|
| 444 |
"Great Wall": [
|
| 445 |
+
"Steed",
|
| 446 |
+
"V200",
|
| 447 |
+
"V240",
|
| 448 |
+
"X200",
|
| 449 |
+
"X240",
|
| 450 |
+
],
|
| 451 |
+
"Gwm": [
|
| 452 |
+
"Cannon Alpha",
|
| 453 |
+
"Haval H6",
|
| 454 |
+
"Haval H6Gt",
|
| 455 |
+
"Haval Jolion",
|
| 456 |
+
"Ora",
|
| 457 |
+
"Steed",
|
| 458 |
+
"Tank 300",
|
| 459 |
+
"Tank 500",
|
| 460 |
+
"Ute",
|
| 461 |
+
],
|
| 462 |
+
"Harley Davidson": [
|
| 463 |
+
"Hard Tail",
|
| 464 |
+
"Roadster",
|
| 465 |
+
],
|
| 466 |
+
"Haval": [
|
| 467 |
+
"H2",
|
| 468 |
+
"H6",
|
| 469 |
+
"H6Gt",
|
| 470 |
+
"H8",
|
| 471 |
+
"H9",
|
| 472 |
+
"Jolion",
|
| 473 |
+
],
|
| 474 |
+
"Hino": [
|
| 475 |
+
"300",
|
| 476 |
+
"300 Series",
|
| 477 |
+
"500 Series",
|
| 478 |
+
"Dutro",
|
| 479 |
+
"Gh Super Eagle",
|
| 480 |
+
"Other",
|
| 481 |
+
"Ranger",
|
| 482 |
],
|
| 483 |
"Holden": [
|
| 484 |
+
"Acadia",
|
| 485 |
+
"Adventra",
|
| 486 |
+
"Astra",
|
| 487 |
+
"Barina",
|
| 488 |
+
"Barina Spark",
|
| 489 |
+
"Berlina",
|
| 490 |
"Calais",
|
| 491 |
+
"Caprice",
|
| 492 |
"Captiva",
|
| 493 |
+
"Cascada",
|
| 494 |
"Colorado",
|
| 495 |
"Colorado 7",
|
| 496 |
+
"Combo",
|
| 497 |
"Commodore",
|
| 498 |
+
"Crewman",
|
| 499 |
"Cruze",
|
| 500 |
+
"Cruze Equipe",
|
| 501 |
+
"Epica",
|
| 502 |
+
"Equinox",
|
| 503 |
+
"Frontera",
|
| 504 |
+
"Hg",
|
| 505 |
+
"Hz",
|
| 506 |
+
"Insignia",
|
| 507 |
+
"Jackaroo",
|
| 508 |
+
"Kingswood",
|
| 509 |
+
"Malibu",
|
| 510 |
+
"Monaro",
|
| 511 |
+
"Other",
|
| 512 |
+
"Rodeo",
|
| 513 |
+
"Sandman",
|
| 514 |
+
"Spark",
|
| 515 |
+
"Statesman",
|
| 516 |
+
"Tigra",
|
| 517 |
+
"Torana",
|
| 518 |
+
"Trailblazer",
|
| 519 |
"Trax",
|
| 520 |
+
"Ute",
|
| 521 |
+
"Vectra",
|
| 522 |
+
"Viva",
|
| 523 |
+
"Volt",
|
| 524 |
],
|
| 525 |
"Honda": [
|
| 526 |
+
"Accord",
|
| 527 |
+
"Accord Euro",
|
| 528 |
+
"Acty",
|
| 529 |
+
"Beat",
|
| 530 |
+
"Cbr",
|
| 531 |
+
"City",
|
| 532 |
+
"Civic",
|
| 533 |
+
"Cr-V",
|
| 534 |
+
"Cr-Z",
|
| 535 |
+
"Crx",
|
| 536 |
+
"Fit",
|
| 537 |
+
"Fit Shuttle",
|
| 538 |
+
"Hr-V",
|
| 539 |
+
"Insight",
|
| 540 |
+
"Integra",
|
| 541 |
+
"Jazz",
|
| 542 |
+
"Legend",
|
| 543 |
+
"Mdx",
|
| 544 |
+
"N-Box",
|
| 545 |
+
"N-One",
|
| 546 |
+
"Odyssey",
|
| 547 |
+
"Other",
|
| 548 |
+
"Prelude",
|
| 549 |
+
"S2000",
|
| 550 |
+
"S660",
|
| 551 |
+
"Shuttle",
|
| 552 |
+
"Vezel",
|
| 553 |
+
"Zr-V",
|
| 554 |
+
],
|
| 555 |
+
"Hsv": [
|
| 556 |
+
"Avalanche",
|
| 557 |
+
"Clubsport",
|
| 558 |
+
"Colorado",
|
| 559 |
+
"Coupe",
|
| 560 |
+
"Grange",
|
| 561 |
+
"Gts",
|
| 562 |
+
"Gtsr",
|
| 563 |
+
"Gtsr Maloo",
|
| 564 |
+
"Maloo",
|
| 565 |
+
"Manta",
|
| 566 |
+
"Other",
|
| 567 |
+
"Senator",
|
| 568 |
+
],
|
| 569 |
+
"Hummer": [
|
| 570 |
+
"H3",
|
| 571 |
+
],
|
| 572 |
+
"Hyosung": [
|
| 573 |
+
"Gt650R",
|
| 574 |
],
|
| 575 |
"Hyundai": [
|
| 576 |
"Accent",
|
| 577 |
"Elantra",
|
| 578 |
+
"Elantra Lavita",
|
| 579 |
+
"Excel",
|
| 580 |
+
"Genesis",
|
| 581 |
+
"Getz",
|
| 582 |
+
"Grandeur",
|
| 583 |
+
"I20",
|
| 584 |
"I30",
|
| 585 |
+
"I40",
|
| 586 |
+
"I45",
|
| 587 |
"Iload",
|
| 588 |
+
"Imax",
|
| 589 |
+
"Ioniq",
|
| 590 |
+
"Ioniq 5",
|
| 591 |
+
"Ioniq 6",
|
| 592 |
+
"Ix35",
|
| 593 |
"Kona",
|
| 594 |
+
"Lantra",
|
| 595 |
+
"Mighty",
|
| 596 |
+
"Palisade",
|
| 597 |
+
"Santa Fe",
|
| 598 |
+
"Sonata",
|
| 599 |
+
"Staria",
|
| 600 |
+
"Staria Load",
|
| 601 |
+
"Terracan",
|
| 602 |
+
"Tiburon",
|
| 603 |
+
"Trajet",
|
| 604 |
"Tucson",
|
| 605 |
+
"Veloster",
|
| 606 |
+
"Venue",
|
| 607 |
+
],
|
| 608 |
+
"Indian": [
|
| 609 |
+
"Touring",
|
| 610 |
+
],
|
| 611 |
+
"Ineos": [
|
| 612 |
+
"Grenadier",
|
| 613 |
+
],
|
| 614 |
+
"Infiniti": [
|
| 615 |
+
"Fx30D",
|
| 616 |
+
"G37",
|
| 617 |
+
"M37",
|
| 618 |
+
"Q30",
|
| 619 |
+
"Q50",
|
| 620 |
+
"Q70",
|
| 621 |
+
"Qx30",
|
| 622 |
+
"Qx70",
|
| 623 |
+
"Qx80",
|
| 624 |
+
],
|
| 625 |
+
"International": [
|
| 626 |
+
"Acco",
|
| 627 |
],
|
| 628 |
"Isuzu": [
|
| 629 |
+
"200",
|
| 630 |
+
"550 Long",
|
| 631 |
+
"D-Max",
|
| 632 |
+
"Frr500",
|
| 633 |
+
"Fts",
|
| 634 |
+
"Mu-X",
|
| 635 |
+
"Nkr200",
|
| 636 |
+
"Nnr",
|
| 637 |
+
"Npr",
|
| 638 |
+
"Npr 200",
|
| 639 |
+
"Nqr",
|
| 640 |
+
"Nqr N5",
|
| 641 |
+
"Other",
|
| 642 |
+
],
|
| 643 |
+
"Iveco": [
|
| 644 |
+
"Daily",
|
| 645 |
+
"Eurocargo",
|
| 646 |
],
|
| 647 |
"Jaguar": [
|
| 648 |
+
"E Type",
|
| 649 |
+
"E-Pace",
|
| 650 |
+
"F-Pace",
|
| 651 |
+
"F-Type",
|
| 652 |
+
"I-Pace",
|
| 653 |
+
"Mk Ii",
|
| 654 |
+
"S Type",
|
| 655 |
+
"Sovereign",
|
| 656 |
+
"V12",
|
| 657 |
+
"X Type",
|
| 658 |
+
"Xe",
|
| 659 |
+
"Xf",
|
| 660 |
+
"Xj",
|
| 661 |
+
"Xj6",
|
| 662 |
+
"Xj8",
|
| 663 |
+
"Xjr",
|
| 664 |
+
"Xjsc",
|
| 665 |
+
"Xk",
|
| 666 |
+
"Xk8",
|
| 667 |
+
"Xkr",
|
| 668 |
+
],
|
| 669 |
+
"Jayco": [
|
| 670 |
+
"Eagle",
|
| 671 |
],
|
| 672 |
"Jeep": [
|
| 673 |
+
"Cherokee",
|
| 674 |
+
"Commander",
|
| 675 |
+
"Compass",
|
| 676 |
+
"Gladiator",
|
| 677 |
+
"Grand Cherokee",
|
| 678 |
+
"Grand Cherokee L",
|
| 679 |
+
"Patriot",
|
| 680 |
+
"Renegade",
|
| 681 |
+
"Wrangler",
|
| 682 |
+
"Wrangler Unlimited",
|
| 683 |
+
],
|
| 684 |
+
"Jensen": [
|
| 685 |
+
"Interceptor",
|
| 686 |
+
],
|
| 687 |
+
"Jmc": [
|
| 688 |
+
"Conquer",
|
| 689 |
+
"Vigus",
|
| 690 |
],
|
| 691 |
"Kia": [
|
| 692 |
+
"Carnival",
|
| 693 |
"Cerato",
|
| 694 |
+
"Ev6",
|
| 695 |
+
"Ev9",
|
| 696 |
+
"Grand Carnival",
|
| 697 |
+
"K2700",
|
| 698 |
+
"K2900",
|
| 699 |
+
"Magentis",
|
| 700 |
+
"Niro",
|
| 701 |
"Optima",
|
| 702 |
+
"Picanto",
|
| 703 |
+
"Pregio",
|
| 704 |
+
"Rio",
|
| 705 |
+
"Rondo",
|
| 706 |
+
"Seltos",
|
| 707 |
"Sorento",
|
| 708 |
+
"Soul",
|
| 709 |
+
"Spectra",
|
| 710 |
+
"Sportage",
|
| 711 |
+
"Stinger",
|
| 712 |
+
"Stonic",
|
| 713 |
],
|
| 714 |
+
"Kobelco": [
|
| 715 |
+
"Sk09Sr",
|
| 716 |
+
],
|
| 717 |
+
"Koda": [
|
| 718 |
+
"Karoq",
|
| 719 |
+
],
|
| 720 |
+
"Lamborghini": [
|
| 721 |
+
"Aventador",
|
| 722 |
+
"Countach",
|
| 723 |
+
"Espada",
|
| 724 |
+
"Gallardo",
|
| 725 |
+
"Huracan",
|
| 726 |
+
"Urus",
|
| 727 |
],
|
| 728 |
"Land Rover": [
|
| 729 |
+
"Defender",
|
| 730 |
+
"Discovery",
|
| 731 |
+
"Discovery 3",
|
| 732 |
+
"Discovery 4",
|
| 733 |
+
"Discovery Sport",
|
| 734 |
+
"Freelander",
|
| 735 |
+
"Freelander 2",
|
| 736 |
+
"Other",
|
| 737 |
+
"Range Rover",
|
| 738 |
+
"Range Rover Autobiograph",
|
| 739 |
+
"Range Rover Evoque",
|
| 740 |
+
"Range Rover Fifty",
|
| 741 |
+
"Range Rover Sport",
|
| 742 |
+
"Range Rover Velar",
|
| 743 |
+
"Series 1",
|
| 744 |
+
],
|
| 745 |
+
"Ldv": [
|
| 746 |
+
"D90",
|
| 747 |
+
"Deliver 9",
|
| 748 |
+
"Delivery9",
|
| 749 |
+
"Edeliver 7",
|
| 750 |
+
"Et60",
|
| 751 |
+
"G10",
|
| 752 |
+
"Mifa",
|
| 753 |
+
"Mifa 9",
|
| 754 |
+
"T60",
|
| 755 |
+
"T60 Max",
|
| 756 |
+
"V80",
|
| 757 |
],
|
| 758 |
+
"Lexus": [
|
| 759 |
+
"Ct",
|
| 760 |
+
"Ct 200H",
|
| 761 |
+
"Ct 200H. Hybrid",
|
| 762 |
+
"Ct200H",
|
| 763 |
+
"Es250",
|
| 764 |
+
"Es300",
|
| 765 |
+
"Es300H",
|
| 766 |
+
"Es350",
|
| 767 |
+
"Gs250",
|
| 768 |
+
"Gs300",
|
| 769 |
+
"Gs300H",
|
| 770 |
+
"Gs350",
|
| 771 |
+
"Gs430",
|
| 772 |
+
"Gs450H",
|
| 773 |
+
"Gs460",
|
| 774 |
+
"Hs",
|
| 775 |
+
"Hs250H Hybrid",
|
| 776 |
+
"Is",
|
| 777 |
+
"Is F",
|
| 778 |
+
"Is200",
|
| 779 |
+
"Is200T",
|
| 780 |
+
"Is250",
|
| 781 |
+
"Is250C",
|
| 782 |
+
"Is300",
|
| 783 |
+
"Is300H",
|
| 784 |
+
"Is350",
|
| 785 |
+
"Lc500",
|
| 786 |
+
"Lm",
|
| 787 |
+
"Ls430",
|
| 788 |
+
"Ls460",
|
| 789 |
+
"Ls460L",
|
| 790 |
+
"Ls500",
|
| 791 |
+
"Ls500H",
|
| 792 |
+
"Lx",
|
| 793 |
+
"Lx450D",
|
| 794 |
+
"Lx470",
|
| 795 |
+
"Lx500D",
|
| 796 |
+
"Lx570",
|
| 797 |
+
"Lx600",
|
| 798 |
+
"Nx",
|
| 799 |
+
"Nx200T",
|
| 800 |
+
"Nx250",
|
| 801 |
+
"Nx300",
|
| 802 |
+
"Nx300H",
|
| 803 |
+
"Nx350",
|
| 804 |
+
"Nx350H",
|
| 805 |
+
"Rc F",
|
| 806 |
+
"Rc200T",
|
| 807 |
+
"Rc350",
|
| 808 |
+
"Rx",
|
| 809 |
+
"Rx200T",
|
| 810 |
+
"Rx270",
|
| 811 |
+
"Rx300",
|
| 812 |
+
"Rx330",
|
| 813 |
+
"Rx350",
|
| 814 |
+
"Rx350H",
|
| 815 |
+
"Rx350L",
|
| 816 |
+
"Rx400H",
|
| 817 |
+
"Rx450H",
|
| 818 |
+
"Rx450Hl",
|
| 819 |
+
"Rx500H",
|
| 820 |
+
"Rz",
|
| 821 |
+
"Rz450E",
|
| 822 |
+
"Sc430",
|
| 823 |
+
"Ux",
|
| 824 |
+
"Ux200",
|
| 825 |
+
"Ux250H",
|
| 826 |
+
"Ux300E",
|
| 827 |
+
],
|
| 828 |
+
"Leyland": [
|
| 829 |
+
"Mini",
|
| 830 |
+
],
|
| 831 |
+
"Lotus": [
|
| 832 |
+
"Elise",
|
| 833 |
+
"Exige",
|
| 834 |
+
"Super 7",
|
| 835 |
+
],
|
| 836 |
+
"Mahindra": [
|
| 837 |
+
"Other",
|
| 838 |
+
"Pik-Up",
|
| 839 |
+
"Scorpio",
|
| 840 |
+
"Scorpio-N",
|
| 841 |
+
"Xuv500",
|
| 842 |
+
"Xuv700",
|
| 843 |
+
],
|
| 844 |
+
"Maserati": [
|
| 845 |
+
"Ghibli",
|
| 846 |
+
"Grancabrio",
|
| 847 |
+
"Granturismo",
|
| 848 |
+
"Grecale",
|
| 849 |
+
"Levante",
|
| 850 |
+
"Mc20",
|
| 851 |
+
"Quattroporte",
|
| 852 |
+
],
|
| 853 |
+
"Mastercraft": [
|
| 854 |
+
"X15",
|
| 855 |
],
|
| 856 |
"Mazda": [
|
| 857 |
+
"1000",
|
| 858 |
+
"121",
|
| 859 |
+
"2",
|
| 860 |
"3",
|
| 861 |
+
"323",
|
| 862 |
"6",
|
| 863 |
+
"626",
|
| 864 |
+
"929",
|
| 865 |
+
"Axela",
|
| 866 |
+
"B2500",
|
| 867 |
+
"B2600",
|
| 868 |
+
"B4000",
|
| 869 |
+
"Bravo",
|
| 870 |
+
"Bt-50",
|
| 871 |
+
"Cx-3",
|
| 872 |
+
"Cx-30",
|
| 873 |
+
"Cx-5",
|
| 874 |
+
"Cx-60",
|
| 875 |
+
"Cx-7",
|
| 876 |
+
"Cx-8",
|
| 877 |
+
"Cx-9",
|
| 878 |
+
"Cx-90",
|
| 879 |
+
"Cx30",
|
| 880 |
+
"E2000",
|
| 881 |
+
"E2500",
|
| 882 |
+
"Mazda2",
|
| 883 |
+
"Mazda3",
|
| 884 |
+
"Mazda6",
|
| 885 |
+
"Mpv",
|
| 886 |
+
"Mx-30",
|
| 887 |
+
"Mx-5",
|
| 888 |
+
"Mx6",
|
| 889 |
+
"Rx-7",
|
| 890 |
+
"Rx-8",
|
| 891 |
+
"Rx7",
|
| 892 |
+
"Tribute",
|
| 893 |
+
],
|
| 894 |
+
"Mclaren": [
|
| 895 |
+
"570S",
|
| 896 |
+
"650S",
|
| 897 |
+
"720S",
|
| 898 |
+
],
|
| 899 |
+
"Mer": [
|
| 900 |
+
"Gle450 Amg 4M C",
|
| 901 |
+
],
|
| 902 |
+
"Mercedes": [
|
| 903 |
+
"Sprinter",
|
| 904 |
+
],
|
| 905 |
+
"Mercedes Benz": [
|
| 906 |
+
"Sprinter",
|
| 907 |
+
],
|
| 908 |
+
"Mercedes-Amg": [
|
| 909 |
+
"A45",
|
| 910 |
+
"C",
|
| 911 |
+
"Cla",
|
| 912 |
+
"E",
|
| 913 |
+
"G",
|
| 914 |
+
"Gla",
|
| 915 |
+
"Glb",
|
| 916 |
+
"Glc",
|
| 917 |
+
"Gle",
|
| 918 |
+
"Gls",
|
| 919 |
+
"Gt",
|
| 920 |
],
|
| 921 |
"Mercedes-Benz": [
|
| 922 |
+
"190",
|
| 923 |
+
"250",
|
| 924 |
+
"280",
|
| 925 |
+
"280Se",
|
| 926 |
+
"300",
|
| 927 |
+
"300Sl",
|
| 928 |
+
"380",
|
| 929 |
+
"420",
|
| 930 |
+
"450",
|
| 931 |
+
"500",
|
| 932 |
+
"560",
|
| 933 |
+
"560Sl",
|
| 934 |
+
"A-Class",
|
| 935 |
+
"A150",
|
| 936 |
+
"A160",
|
| 937 |
+
"A170",
|
| 938 |
+
"A180",
|
| 939 |
+
"A200",
|
| 940 |
+
"A250",
|
| 941 |
+
"A35",
|
| 942 |
+
"A45",
|
| 943 |
+
"B-Class",
|
| 944 |
+
"B180",
|
| 945 |
+
"B200",
|
| 946 |
+
"B250",
|
| 947 |
+
"C",
|
| 948 |
+
"C-Class",
|
| 949 |
"C180",
|
| 950 |
+
"C200",
|
| 951 |
+
"C200 Cdi",
|
| 952 |
+
"C200 Cgi",
|
| 953 |
+
"C200 Kompressor",
|
| 954 |
+
"C220",
|
| 955 |
+
"C220 Cdi",
|
| 956 |
+
"C230",
|
| 957 |
+
"C240",
|
| 958 |
"C250",
|
| 959 |
+
"C280",
|
| 960 |
+
"C300",
|
| 961 |
+
"C320",
|
| 962 |
+
"C320 Cdi",
|
| 963 |
+
"C350",
|
| 964 |
+
"C43",
|
| 965 |
+
"C55",
|
| 966 |
+
"C63",
|
| 967 |
+
"Cl-Class",
|
| 968 |
+
"Cl500",
|
| 969 |
+
"Cl55",
|
| 970 |
+
"Cla",
|
| 971 |
+
"Cla-Class",
|
| 972 |
+
"Cla180",
|
| 973 |
+
"Cla200",
|
| 974 |
+
"Cla250",
|
| 975 |
+
"Cla35",
|
| 976 |
+
"Cla45",
|
| 977 |
+
"Clc",
|
| 978 |
+
"Clc200",
|
| 979 |
+
"Clc200 Kompressor",
|
| 980 |
+
"Clk-Class",
|
| 981 |
+
"Clk200",
|
| 982 |
+
"Clk200K",
|
| 983 |
+
"Clk240",
|
| 984 |
+
"Clk280",
|
| 985 |
+
"Clk320",
|
| 986 |
+
"Clk350",
|
| 987 |
+
"Clk500",
|
| 988 |
+
"Clk55",
|
| 989 |
+
"Clk63",
|
| 990 |
+
"Cls",
|
| 991 |
+
"Cls-Class",
|
| 992 |
+
"Cls250",
|
| 993 |
+
"Cls350",
|
| 994 |
+
"Cls400",
|
| 995 |
+
"Cls500",
|
| 996 |
+
"Cls63",
|
| 997 |
+
"E-Class",
|
| 998 |
+
"E200",
|
| 999 |
+
"E200K",
|
| 1000 |
+
"E220",
|
| 1001 |
+
"E240",
|
| 1002 |
+
"E250",
|
| 1003 |
+
"E250 Cdi",
|
| 1004 |
+
"E250 Cgi",
|
| 1005 |
+
"E270",
|
| 1006 |
+
"E280",
|
| 1007 |
+
"E300",
|
| 1008 |
+
"E320",
|
| 1009 |
"E350",
|
| 1010 |
+
"E400",
|
| 1011 |
+
"E43",
|
| 1012 |
+
"E450",
|
| 1013 |
+
"E500",
|
| 1014 |
+
"E53",
|
| 1015 |
+
"E55",
|
| 1016 |
+
"E62",
|
| 1017 |
+
"E63",
|
| 1018 |
+
"Eqa",
|
| 1019 |
+
"Eqb",
|
| 1020 |
+
"Eqc",
|
| 1021 |
+
"Eqe",
|
| 1022 |
+
"Eqe53",
|
| 1023 |
+
"Eqs",
|
| 1024 |
+
"Eqs53",
|
| 1025 |
+
"G",
|
| 1026 |
+
"G-Class",
|
| 1027 |
+
"G63",
|
| 1028 |
+
"Gl",
|
| 1029 |
+
"Gl-Class",
|
| 1030 |
+
"Gl320",
|
| 1031 |
+
"Gl350",
|
| 1032 |
+
"Gl450",
|
| 1033 |
+
"Gl500",
|
| 1034 |
+
"Gl63",
|
| 1035 |
+
"Gla",
|
| 1036 |
+
"Gla-Class",
|
| 1037 |
+
"Gla180",
|
| 1038 |
+
"Gla200",
|
| 1039 |
+
"Gla220",
|
| 1040 |
+
"Gla250",
|
| 1041 |
+
"Gla35",
|
| 1042 |
+
"Gla45",
|
| 1043 |
+
"Glb",
|
| 1044 |
+
"Glb-Class",
|
| 1045 |
+
"Glb35",
|
| 1046 |
+
"Glc",
|
| 1047 |
+
"Glc-Class",
|
| 1048 |
+
"Glc200",
|
| 1049 |
+
"Glc220",
|
| 1050 |
+
"Glc250",
|
| 1051 |
+
"Glc300",
|
| 1052 |
+
"Glc350",
|
| 1053 |
+
"Glc43",
|
| 1054 |
+
"Glc63",
|
| 1055 |
+
"Gle",
|
| 1056 |
+
"Gle-Class",
|
| 1057 |
+
"Gle-Class C167",
|
| 1058 |
+
"Gle250",
|
| 1059 |
+
"Gle300",
|
| 1060 |
+
"Gle350",
|
| 1061 |
+
"Gle400",
|
| 1062 |
+
"Gle43",
|
| 1063 |
+
"Gle450",
|
| 1064 |
+
"Gle500",
|
| 1065 |
+
"Gle53",
|
| 1066 |
+
"Gle63",
|
| 1067 |
+
"Gls",
|
| 1068 |
+
"Gls-Class",
|
| 1069 |
+
"Gls350",
|
| 1070 |
+
"Gls500",
|
| 1071 |
+
"Gls63",
|
| 1072 |
+
"Gt",
|
| 1073 |
+
"Gt63",
|
| 1074 |
+
"M-Class",
|
| 1075 |
+
"Maybach",
|
| 1076 |
+
"Mb100",
|
| 1077 |
+
"Ml",
|
| 1078 |
+
"Ml250",
|
| 1079 |
+
"Ml270",
|
| 1080 |
+
"Ml280",
|
| 1081 |
+
"Ml300",
|
| 1082 |
+
"Ml300 Cdi",
|
| 1083 |
+
"Ml320",
|
| 1084 |
+
"Ml350",
|
| 1085 |
+
"Ml400",
|
| 1086 |
+
"Ml500",
|
| 1087 |
+
"Ml63",
|
| 1088 |
+
"R",
|
| 1089 |
+
"R350",
|
| 1090 |
+
"S-Class",
|
| 1091 |
+
"S300",
|
| 1092 |
+
"S320",
|
| 1093 |
+
"S350",
|
| 1094 |
+
"S400",
|
| 1095 |
+
"S450",
|
| 1096 |
+
"S450E",
|
| 1097 |
+
"S500",
|
| 1098 |
+
"S560",
|
| 1099 |
+
"S600",
|
| 1100 |
+
"S600 L",
|
| 1101 |
+
"S63",
|
| 1102 |
+
"Sl",
|
| 1103 |
+
"Sl320",
|
| 1104 |
+
"Sl350",
|
| 1105 |
+
"Sl400",
|
| 1106 |
+
"Sl500",
|
| 1107 |
+
"Sl55",
|
| 1108 |
+
"Sl63",
|
| 1109 |
+
"Slc",
|
| 1110 |
+
"Slc180",
|
| 1111 |
+
"Slc200",
|
| 1112 |
+
"Slk",
|
| 1113 |
+
"Slk-Class",
|
| 1114 |
+
"Slk200",
|
| 1115 |
+
"Slk230",
|
| 1116 |
+
"Slk250",
|
| 1117 |
+
"Slk350",
|
| 1118 |
+
"Slk55",
|
| 1119 |
+
"Sprinter",
|
| 1120 |
+
"V",
|
| 1121 |
+
"V220",
|
| 1122 |
+
"V250",
|
| 1123 |
+
"Valente",
|
| 1124 |
+
"Viano",
|
| 1125 |
+
"Vito",
|
| 1126 |
+
"X",
|
| 1127 |
+
"X250",
|
| 1128 |
+
"X350",
|
| 1129 |
+
],
|
| 1130 |
+
"Mg": [
|
| 1131 |
+
"3",
|
| 1132 |
+
"6 Plus",
|
| 1133 |
+
"F",
|
| 1134 |
+
"Gs",
|
| 1135 |
+
"Hs",
|
| 1136 |
+
"Hs Plus Ev",
|
| 1137 |
+
"Mg3",
|
| 1138 |
+
"Mg3 Auto",
|
| 1139 |
+
"Mg4",
|
| 1140 |
+
"Mg5",
|
| 1141 |
+
"Mg6",
|
| 1142 |
+
"Mg6 Plus",
|
| 1143 |
+
"Mgb",
|
| 1144 |
+
"Zs",
|
| 1145 |
+
"Zs Ev",
|
| 1146 |
+
"Zst",
|
| 1147 |
],
|
| 1148 |
"Mini": [
|
| 1149 |
+
"3D Hatch",
|
| 1150 |
+
"5D Hatch",
|
| 1151 |
+
"Cabrio",
|
| 1152 |
+
"Clubman",
|
| 1153 |
+
"Convertible",
|
| 1154 |
+
"Cooper",
|
| 1155 |
+
"Countryman",
|
| 1156 |
+
"Coupe",
|
| 1157 |
+
"Hatch",
|
| 1158 |
+
"One",
|
| 1159 |
+
"Paceman",
|
| 1160 |
+
"Roadster",
|
| 1161 |
],
|
| 1162 |
"Mitsubishi": [
|
| 1163 |
+
"3000Gt",
|
| 1164 |
+
"380",
|
| 1165 |
+
"Airtrek",
|
| 1166 |
+
"Asx",
|
| 1167 |
+
"Canter",
|
| 1168 |
+
"Challenger",
|
| 1169 |
+
"Colt",
|
| 1170 |
+
"Delica",
|
| 1171 |
+
"Eclipse",
|
| 1172 |
"Eclipse Cross",
|
| 1173 |
+
"Express",
|
| 1174 |
+
"Fe649",
|
| 1175 |
+
"Fuso",
|
| 1176 |
+
"Glx",
|
| 1177 |
+
"Grandis",
|
| 1178 |
+
"I-Miev",
|
| 1179 |
"Lancer",
|
| 1180 |
+
"Magna",
|
| 1181 |
+
"Mirage",
|
| 1182 |
+
"Nimbus",
|
| 1183 |
+
"Other",
|
| 1184 |
"Outlander",
|
| 1185 |
+
"Pajero",
|
| 1186 |
+
"Pajero Mini",
|
| 1187 |
"Pajero Sport",
|
| 1188 |
+
"Rosa",
|
| 1189 |
+
"System.Data.Datarowview",
|
| 1190 |
+
"Triton",
|
| 1191 |
+
"Verada",
|
| 1192 |
+
],
|
| 1193 |
+
"Mitsubishi Fuso": [
|
| 1194 |
+
"Canter",
|
| 1195 |
+
"Other",
|
| 1196 |
+
],
|
| 1197 |
+
"Morgan": [
|
| 1198 |
+
"Aero 8",
|
| 1199 |
+
"Plus 8",
|
| 1200 |
+
"Roadster",
|
| 1201 |
+
],
|
| 1202 |
+
"Morris": [
|
| 1203 |
+
"Major",
|
| 1204 |
],
|
| 1205 |
"Nissan": [
|
| 1206 |
+
"300Zx",
|
| 1207 |
+
"350Z",
|
| 1208 |
+
"370Z",
|
| 1209 |
+
"Almera",
|
| 1210 |
+
"Altima",
|
| 1211 |
+
"Atlas",
|
| 1212 |
+
"Aura",
|
| 1213 |
+
"Caravan",
|
| 1214 |
+
"Caravan Nv350",
|
| 1215 |
+
"Cube",
|
| 1216 |
+
"Dualis",
|
| 1217 |
+
"E-Nv200",
|
| 1218 |
+
"El Grand",
|
| 1219 |
+
"El Grande",
|
| 1220 |
+
"Elgrand",
|
| 1221 |
+
"Figaro",
|
| 1222 |
+
"Gt-R",
|
| 1223 |
+
"Juke",
|
| 1224 |
+
"Kicks",
|
| 1225 |
+
"Leaf",
|
| 1226 |
"Maxima",
|
| 1227 |
+
"Micra",
|
| 1228 |
+
"Murano",
|
| 1229 |
"Navara",
|
| 1230 |
+
"Note",
|
| 1231 |
+
"Nv200",
|
| 1232 |
+
"Nv350",
|
| 1233 |
+
"Nvdp4Tast225",
|
| 1234 |
+
"Other",
|
| 1235 |
"Pathfinder",
|
| 1236 |
"Patrol",
|
| 1237 |
+
"Pulsar",
|
| 1238 |
"Qashqai",
|
| 1239 |
+
"R35 Gt-R",
|
| 1240 |
+
"Serena",
|
| 1241 |
+
"Silvia",
|
| 1242 |
"Skyline",
|
| 1243 |
+
"Stagea",
|
| 1244 |
+
"Tiida",
|
| 1245 |
+
"Titan",
|
| 1246 |
+
"Vanette",
|
| 1247 |
+
"X-Trail",
|
| 1248 |
+
"Xtrail St-L Ts 2 Wagon",
|
| 1249 |
+
"Z",
|
| 1250 |
+
],
|
| 1251 |
+
"Opel": [
|
| 1252 |
+
"Astra",
|
| 1253 |
+
"Corsa",
|
| 1254 |
+
"Insignia",
|
| 1255 |
+
"Zafira",
|
| 1256 |
+
],
|
| 1257 |
+
"Packard": [
|
| 1258 |
+
"120",
|
| 1259 |
+
],
|
| 1260 |
+
"Peugeot": [
|
| 1261 |
+
"2008",
|
| 1262 |
+
"206",
|
| 1263 |
+
"207",
|
| 1264 |
+
"208",
|
| 1265 |
+
"3008",
|
| 1266 |
+
"307",
|
| 1267 |
+
"308",
|
| 1268 |
+
"4007",
|
| 1269 |
+
"4008",
|
| 1270 |
+
"405",
|
| 1271 |
+
"406",
|
| 1272 |
+
"407",
|
| 1273 |
+
"408",
|
| 1274 |
+
"5008",
|
| 1275 |
+
"508",
|
| 1276 |
+
"Boxer",
|
| 1277 |
+
"E-2008",
|
| 1278 |
+
"E-Partner",
|
| 1279 |
+
"Expert",
|
| 1280 |
+
"Partner",
|
| 1281 |
+
"Rcz",
|
| 1282 |
+
],
|
| 1283 |
+
"Polestar": [
|
| 1284 |
+
"2",
|
| 1285 |
+
],
|
| 1286 |
+
"Pontiac": [
|
| 1287 |
+
"Firebird",
|
| 1288 |
+
"Gto",
|
| 1289 |
+
"Parisienne",
|
| 1290 |
],
|
| 1291 |
"Porsche": [
|
| 1292 |
+
"356",
|
| 1293 |
+
"718",
|
| 1294 |
+
"911",
|
| 1295 |
+
"Boxster",
|
| 1296 |
"Cayenne",
|
| 1297 |
+
"Cayman",
|
| 1298 |
+
"Macan",
|
| 1299 |
+
"Panamera",
|
| 1300 |
+
"Taycan",
|
| 1301 |
+
],
|
| 1302 |
+
"Pride": [
|
| 1303 |
+
"Ssr 1800",
|
| 1304 |
+
],
|
| 1305 |
+
"Proton": [
|
| 1306 |
+
"Gen.2",
|
| 1307 |
+
"Jumbuck",
|
| 1308 |
+
"Persona",
|
| 1309 |
+
"Preve",
|
| 1310 |
+
"Satria",
|
| 1311 |
+
],
|
| 1312 |
+
"Ram": [
|
| 1313 |
+
"1500",
|
| 1314 |
+
"2500",
|
| 1315 |
+
"Laramie",
|
| 1316 |
+
],
|
| 1317 |
+
"Range Rover": [
|
| 1318 |
+
"Evoque",
|
| 1319 |
+
"Range Rover",
|
| 1320 |
+
"Velar",
|
| 1321 |
+
],
|
| 1322 |
+
"Rcr": [
|
| 1323 |
+
"Superlite",
|
| 1324 |
],
|
| 1325 |
"Renault": [
|
| 1326 |
+
"Arkana",
|
| 1327 |
"Captur",
|
| 1328 |
+
"Clio",
|
| 1329 |
+
"Fluence",
|
| 1330 |
+
"Kadjar",
|
| 1331 |
+
"Kangoo",
|
| 1332 |
+
"Koleos",
|
| 1333 |
+
"Laguna",
|
| 1334 |
+
"Latitude",
|
| 1335 |
+
"Master",
|
| 1336 |
+
"Megane",
|
| 1337 |
+
"Megane E-Tech",
|
| 1338 |
+
"Megane Hatch 5Dr",
|
| 1339 |
+
"Scenic",
|
| 1340 |
+
"Scenic Ii",
|
| 1341 |
+
"Trafic",
|
| 1342 |
+
],
|
| 1343 |
+
"Rolls-Royce": [
|
| 1344 |
+
"Corniche",
|
| 1345 |
+
"Ghost",
|
| 1346 |
+
"Phantom",
|
| 1347 |
+
"Silver",
|
| 1348 |
+
"Silver Spirit",
|
| 1349 |
+
"Wraith",
|
| 1350 |
+
],
|
| 1351 |
+
"Rover": [
|
| 1352 |
+
"75",
|
| 1353 |
+
"Mini",
|
| 1354 |
+
],
|
| 1355 |
+
"Saab": [
|
| 1356 |
+
"9-Mar",
|
| 1357 |
+
"9-May",
|
| 1358 |
+
"900",
|
| 1359 |
+
],
|
| 1360 |
+
"Sea Doo": [
|
| 1361 |
+
"Gti",
|
| 1362 |
+
],
|
| 1363 |
+
"Seadoo": [
|
| 1364 |
+
"Fishpro 155",
|
| 1365 |
+
],
|
| 1366 |
+
"Seat": [
|
| 1367 |
+
"250 Slx",
|
| 1368 |
],
|
| 1369 |
"Skoda": [
|
| 1370 |
+
"Fabia",
|
| 1371 |
+
"Kamiq",
|
| 1372 |
+
"Karoq",
|
| 1373 |
+
"Kodiaq",
|
| 1374 |
+
"Octavia",
|
| 1375 |
+
"Rapid",
|
| 1376 |
+
"Rapid Spaceback",
|
| 1377 |
+
"Roomster",
|
| 1378 |
+
"Scala",
|
| 1379 |
+
"Superb",
|
| 1380 |
+
"Yeti",
|
| 1381 |
+
],
|
| 1382 |
+
"Smart": [
|
| 1383 |
+
"Fortwo",
|
| 1384 |
+
],
|
| 1385 |
+
"Ssangyong": [
|
| 1386 |
+
"Actyon",
|
| 1387 |
+
"Actyon Sports",
|
| 1388 |
+
"Korando",
|
| 1389 |
+
"Kyron",
|
| 1390 |
+
"Musso",
|
| 1391 |
+
"Musso Xlv",
|
| 1392 |
+
"Rexton",
|
| 1393 |
+
"Stavic",
|
| 1394 |
+
"Tivoli",
|
| 1395 |
],
|
| 1396 |
"Subaru": [
|
| 1397 |
+
"Brumby",
|
| 1398 |
+
"Brz",
|
| 1399 |
+
"Crosstrek",
|
| 1400 |
"Forester",
|
| 1401 |
"Impreza",
|
| 1402 |
+
"Legacy",
|
| 1403 |
+
"Levorg",
|
| 1404 |
"Liberty",
|
| 1405 |
+
"Other",
|
| 1406 |
+
"Outback",
|
| 1407 |
+
"Sambar",
|
| 1408 |
+
"Solterra",
|
| 1409 |
+
"Tribeca",
|
| 1410 |
+
"Wrx",
|
| 1411 |
+
"Wrx Premium",
|
| 1412 |
+
"Xv",
|
| 1413 |
],
|
| 1414 |
"Suzuki": [
|
| 1415 |
+
"Alto",
|
| 1416 |
+
"Apv",
|
| 1417 |
+
"Baleno",
|
| 1418 |
+
"Carry",
|
| 1419 |
+
"Celerio",
|
| 1420 |
+
"Every",
|
| 1421 |
+
"Grand Vitara",
|
| 1422 |
+
"Ignis",
|
| 1423 |
"Jimny",
|
| 1424 |
+
"Kizashi",
|
| 1425 |
+
"Liana",
|
| 1426 |
+
"S-Cross",
|
| 1427 |
+
"Sierra",
|
| 1428 |
+
"Spacia Custom",
|
| 1429 |
+
"Swift",
|
| 1430 |
+
"Sx4",
|
| 1431 |
+
"Vitara",
|
| 1432 |
+
"Volusia",
|
| 1433 |
+
"X-90",
|
| 1434 |
+
"Xl-7",
|
| 1435 |
+
],
|
| 1436 |
+
"Tata": [
|
| 1437 |
+
"Xenon",
|
| 1438 |
+
],
|
| 1439 |
+
"Tesla": [
|
| 1440 |
+
"Model 3",
|
| 1441 |
+
"Model S",
|
| 1442 |
+
"Model X",
|
| 1443 |
+
"Model Y",
|
| 1444 |
+
],
|
| 1445 |
+
"Toro": [
|
| 1446 |
+
"Workman",
|
| 1447 |
+
],
|
| 1448 |
+
"Toyota": [
|
| 1449 |
+
"4 Runner",
|
| 1450 |
+
"86",
|
| 1451 |
+
"Alphard",
|
| 1452 |
+
"Altezza",
|
| 1453 |
+
"Aristo",
|
| 1454 |
+
"Aurion",
|
| 1455 |
+
"Avalon",
|
| 1456 |
+
"Avensis",
|
| 1457 |
+
"Axio",
|
| 1458 |
+
"Bb",
|
| 1459 |
+
"Blade",
|
| 1460 |
+
"C-Hr",
|
| 1461 |
+
"Camry",
|
| 1462 |
+
"Celica",
|
| 1463 |
+
"Century",
|
| 1464 |
+
"Chaser",
|
| 1465 |
+
"Coaster",
|
| 1466 |
+
"Corolla",
|
| 1467 |
+
"Corolla Cross",
|
| 1468 |
+
"Corona",
|
| 1469 |
+
"Crown",
|
| 1470 |
+
"Crown Crossover",
|
| 1471 |
+
"Dyna",
|
| 1472 |
+
"Echo",
|
| 1473 |
+
"Esquire",
|
| 1474 |
+
"Estima",
|
| 1475 |
+
"Estima T",
|
| 1476 |
+
"Fielder",
|
| 1477 |
+
"Fj Cruiser",
|
| 1478 |
+
"Fortuner",
|
| 1479 |
+
"Gr Corolla",
|
| 1480 |
+
"Gr Yaris",
|
| 1481 |
+
"Gr86",
|
| 1482 |
+
"Grand Hiace",
|
| 1483 |
+
"Granvia",
|
| 1484 |
+
"Hiace",
|
| 1485 |
+
"Hiace Camper",
|
| 1486 |
+
"Hiace Regius",
|
| 1487 |
+
"Hilux",
|
| 1488 |
+
"Hilux Surf",
|
| 1489 |
+
"Kluger",
|
| 1490 |
+
"Landcruiser",
|
| 1491 |
+
"Landcruiser 70 Series",
|
| 1492 |
+
"Landcruiser Prado",
|
| 1493 |
+
"Lexcen",
|
| 1494 |
+
"Mark Ii",
|
| 1495 |
+
"Mark X",
|
| 1496 |
+
"Mr2",
|
| 1497 |
+
"Noah",
|
| 1498 |
+
"Other",
|
| 1499 |
+
"Porte",
|
| 1500 |
+
"Prado",
|
| 1501 |
+
"Prius",
|
| 1502 |
+
"Prius C",
|
| 1503 |
+
"Prius V",
|
| 1504 |
+
"Prius-C",
|
| 1505 |
+
"Probox",
|
| 1506 |
+
"Ractis",
|
| 1507 |
+
"Raize",
|
| 1508 |
+
"Rav4",
|
| 1509 |
+
"Regius",
|
| 1510 |
+
"Rukus",
|
| 1511 |
+
"Sai",
|
| 1512 |
+
"Sienta",
|
| 1513 |
+
"Soarer",
|
| 1514 |
+
"Spacia",
|
| 1515 |
+
"Spade",
|
| 1516 |
+
"Starlet",
|
| 1517 |
+
"Supra",
|
| 1518 |
+
"Tarago",
|
| 1519 |
+
"Townace",
|
| 1520 |
+
"Tundra",
|
| 1521 |
+
"Vellfire",
|
| 1522 |
+
"Vienta",
|
| 1523 |
+
"Vitz",
|
| 1524 |
+
"Voxy",
|
| 1525 |
+
"Yaris",
|
| 1526 |
+
"Yaris Cross",
|
| 1527 |
+
],
|
| 1528 |
+
"Trailer And Tractor": [
|
| 1529 |
+
"East Wind Tractor",
|
| 1530 |
+
],
|
| 1531 |
+
"Trd": [
|
| 1532 |
+
"Hilux",
|
| 1533 |
+
],
|
| 1534 |
+
"Triumph": [
|
| 1535 |
+
"2500",
|
| 1536 |
+
"Thruxton",
|
| 1537 |
+
"Tr",
|
| 1538 |
],
|
| 1539 |
"Volkswagen": [
|
| 1540 |
"Amarok",
|
| 1541 |
+
"Arteon",
|
| 1542 |
+
"Beetle",
|
| 1543 |
+
"Bora",
|
| 1544 |
+
"Caddy",
|
| 1545 |
+
"Caddy 5",
|
| 1546 |
+
"California",
|
| 1547 |
+
"Caravelle",
|
| 1548 |
+
"Cc",
|
| 1549 |
+
"Crafter",
|
| 1550 |
+
"Eos",
|
| 1551 |
"Golf",
|
| 1552 |
+
"Jetta",
|
| 1553 |
+
"Kombi",
|
| 1554 |
+
"Multivan",
|
| 1555 |
+
"Passat",
|
| 1556 |
+
"Passat Cc",
|
| 1557 |
"Polo",
|
| 1558 |
+
"Scirocco",
|
| 1559 |
+
"T-Cross",
|
| 1560 |
+
"T-Roc",
|
| 1561 |
+
"Tiguan",
|
| 1562 |
+
"Touareg",
|
| 1563 |
+
"Transporter",
|
| 1564 |
+
],
|
| 1565 |
+
"Volkwagen": [
|
| 1566 |
+
"Crafter 35",
|
| 1567 |
],
|
| 1568 |
"Volvo": [
|
| 1569 |
+
"8",
|
| 1570 |
+
"940",
|
| 1571 |
+
"C30",
|
| 1572 |
+
"C40",
|
| 1573 |
+
"C70",
|
| 1574 |
+
"Ex30",
|
| 1575 |
+
"S40",
|
| 1576 |
+
"S60",
|
| 1577 |
+
"S80",
|
| 1578 |
+
"S90",
|
| 1579 |
+
"V40",
|
| 1580 |
+
"V50",
|
| 1581 |
+
"V60",
|
| 1582 |
+
"V60 Cross Country",
|
| 1583 |
+
"V70",
|
| 1584 |
+
"Xc40",
|
| 1585 |
+
"Xc60",
|
| 1586 |
+
"Xc70",
|
| 1587 |
+
"Xc90",
|
| 1588 |
+
],
|
| 1589 |
+
"Yamaha": [
|
| 1590 |
+
"Golf Buggy",
|
| 1591 |
+
"Mt-09",
|
| 1592 |
+
],
|
| 1593 |
}
|
| 1594 |
|
| 1595 |
# Extract makes list for dropdown
|
core/matcher.py
CHANGED
|
@@ -295,9 +295,9 @@ class CarDealerMatcher:
|
|
| 295 |
self.data_files = []
|
| 296 |
|
| 297 |
def search_data_files(self, keyword_search=None, make=None, model=None, year_min=None, year_max=None,
|
| 298 |
-
|
| 299 |
body_type=None, fuel_type=None, max_odometer=None,
|
| 300 |
-
|
| 301 |
max_price=None, selected_file=None, max_results=100, show_dealer_stats=True):
|
| 302 |
"""Search through CSV data files using pandas filtering"""
|
| 303 |
try:
|
|
@@ -362,13 +362,11 @@ class CarDealerMatcher:
|
|
| 362 |
if model and 'model' in df.columns:
|
| 363 |
df = df[df['model'].astype(str).str.contains(model, case=False, na=False)]
|
| 364 |
|
| 365 |
-
# Handle year filtering - prioritize range
|
| 366 |
-
if
|
| 367 |
-
#
|
| 368 |
-
min_year = year_value - year_range
|
| 369 |
-
max_year_range = year_value + year_range
|
| 370 |
year_numeric = pd.to_numeric(df['manu_year'], errors='coerce')
|
| 371 |
-
df = df[(year_numeric >=
|
| 372 |
elif year_min and 'manu_year' in df.columns:
|
| 373 |
df = df[pd.to_numeric(df['manu_year'], errors='coerce') >= year_min]
|
| 374 |
elif year_max and 'manu_year' in df.columns:
|
|
@@ -380,13 +378,11 @@ class CarDealerMatcher:
|
|
| 380 |
if fuel_type and 'vehicle_fuel_type' in df.columns:
|
| 381 |
df = df[df['vehicle_fuel_type'].astype(str).str.contains(fuel_type, case=False, na=False)]
|
| 382 |
|
| 383 |
-
# Handle odometer filtering - prioritize range
|
| 384 |
-
if
|
| 385 |
-
#
|
| 386 |
-
min_odometer = odometer_value - odometer_range
|
| 387 |
-
max_odometer_range = odometer_value + odometer_range
|
| 388 |
odometer_numeric = pd.to_numeric(df['odometer'], errors='coerce')
|
| 389 |
-
df = df[(odometer_numeric >=
|
| 390 |
elif max_odometer and 'odometer' in df.columns:
|
| 391 |
# Fallback to max odometer filter if range search not specified
|
| 392 |
df = df[pd.to_numeric(df['odometer'], errors='coerce') <= max_odometer]
|
|
|
|
| 295 |
self.data_files = []
|
| 296 |
|
| 297 |
def search_data_files(self, keyword_search=None, make=None, model=None, year_min=None, year_max=None,
|
| 298 |
+
year_from=None, year_to=None,
|
| 299 |
body_type=None, fuel_type=None, max_odometer=None,
|
| 300 |
+
odometer_from=None, odometer_to=None,
|
| 301 |
max_price=None, selected_file=None, max_results=100, show_dealer_stats=True):
|
| 302 |
"""Search through CSV data files using pandas filtering"""
|
| 303 |
try:
|
|
|
|
| 362 |
if model and 'model' in df.columns:
|
| 363 |
df = df[df['model'].astype(str).str.contains(model, case=False, na=False)]
|
| 364 |
|
| 365 |
+
# Handle year filtering - prioritize from/to range search over min/max search
|
| 366 |
+
if year_from is not None and year_to is not None and 'manu_year' in df.columns:
|
| 367 |
+
# Direct range search: year_from to year_to
|
|
|
|
|
|
|
| 368 |
year_numeric = pd.to_numeric(df['manu_year'], errors='coerce')
|
| 369 |
+
df = df[(year_numeric >= year_from) & (year_numeric <= year_to)]
|
| 370 |
elif year_min and 'manu_year' in df.columns:
|
| 371 |
df = df[pd.to_numeric(df['manu_year'], errors='coerce') >= year_min]
|
| 372 |
elif year_max and 'manu_year' in df.columns:
|
|
|
|
| 378 |
if fuel_type and 'vehicle_fuel_type' in df.columns:
|
| 379 |
df = df[df['vehicle_fuel_type'].astype(str).str.contains(fuel_type, case=False, na=False)]
|
| 380 |
|
| 381 |
+
# Handle odometer filtering - prioritize from/to range search over max search
|
| 382 |
+
if odometer_from is not None and odometer_to is not None and 'odometer' in df.columns:
|
| 383 |
+
# Direct range search: odometer_from to odometer_to
|
|
|
|
|
|
|
| 384 |
odometer_numeric = pd.to_numeric(df['odometer'], errors='coerce')
|
| 385 |
+
df = df[(odometer_numeric >= odometer_from) & (odometer_numeric <= odometer_to)]
|
| 386 |
elif max_odometer and 'odometer' in df.columns:
|
| 387 |
# Fallback to max odometer filter if range search not specified
|
| 388 |
df = df[pd.to_numeric(df['odometer'], errors='coerce') <= max_odometer]
|
ui/interface.py
CHANGED
|
@@ -12,27 +12,46 @@ def update_models(make):
|
|
| 12 |
"""Update model choices based on selected make"""
|
| 13 |
if make in MAKE_MODEL_DATA:
|
| 14 |
models = MAKE_MODEL_DATA[make]
|
| 15 |
-
|
|
|
|
|
|
|
| 16 |
else:
|
| 17 |
-
return gr.Dropdown(choices=[], value=
|
| 18 |
|
| 19 |
|
| 20 |
def predict_dealers_interface(matcher, make, model, year, body_type, fuel_type, transmission,
|
| 21 |
odometer, doors, seats, engine_size, power, cylinders,
|
| 22 |
safety_rating, drive_type, segment, condition, selected_model):
|
| 23 |
"""Interface function for detailed Gradio prediction"""
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
|
| 29 |
def simple_predict_dealers_interface(matcher, simple_make, simple_model, simple_year,
|
| 30 |
simple_odometer, simple_model_selection):
|
| 31 |
"""Simple interface function for Gradio with conditional parameters"""
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
|
| 33 |
return matcher.predict_dealers(
|
| 34 |
-
make=
|
| 35 |
-
model=
|
| 36 |
year=simple_year,
|
| 37 |
body_type=None,
|
| 38 |
fuel_type=None,
|
|
@@ -47,18 +66,27 @@ def simple_predict_dealers_interface(matcher, simple_make, simple_model, simple_
|
|
| 47 |
drive_type=None,
|
| 48 |
segment=None,
|
| 49 |
condition=None,
|
| 50 |
-
selected_model=
|
| 51 |
)
|
| 52 |
|
| 53 |
|
| 54 |
-
def search_data_interface(matcher, keyword_search, make, model,
|
| 55 |
-
|
| 56 |
"""Interface function for traditional data search"""
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
max_results=max_results, show_dealer_stats=show_dealer_stats)
|
| 63 |
|
| 64 |
if isinstance(result_data, pd.DataFrame) and result_data.empty:
|
|
@@ -83,25 +111,29 @@ def search_data_interface(matcher, keyword_search, make, model, year_value, year
|
|
| 83 |
return message, "No results to display", ""
|
| 84 |
|
| 85 |
|
| 86 |
-
def simple_search_data_interface(matcher, keyword_search, make, model,
|
| 87 |
max_results, show_dealer_stats):
|
| 88 |
"""Interface function for simple traditional data search"""
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
|
| 90 |
message, result_data = matcher.search_data_files(
|
| 91 |
keyword_search=keyword_search,
|
| 92 |
-
make=
|
| 93 |
-
model=
|
| 94 |
year_min=None,
|
| 95 |
year_max=None,
|
| 96 |
-
|
| 97 |
-
|
| 98 |
body_type=None, # Not used in simple search
|
| 99 |
fuel_type=None, # Not used in simple search
|
| 100 |
max_odometer=None, # Not using max_odometer anymore
|
| 101 |
-
|
| 102 |
-
|
| 103 |
max_price=None, # Not used in simple search
|
| 104 |
-
selected_file=
|
| 105 |
max_results=max_results,
|
| 106 |
show_dealer_stats=show_dealer_stats
|
| 107 |
)
|
|
|
|
| 12 |
"""Update model choices based on selected make"""
|
| 13 |
if make in MAKE_MODEL_DATA:
|
| 14 |
models = MAKE_MODEL_DATA[make]
|
| 15 |
+
# Add ALL option at the beginning
|
| 16 |
+
models_with_all = ["ALL"] + models
|
| 17 |
+
return gr.Dropdown(choices=models_with_all, value="ALL")
|
| 18 |
else:
|
| 19 |
+
return gr.Dropdown(choices=["ALL"], value="ALL")
|
| 20 |
|
| 21 |
|
| 22 |
def predict_dealers_interface(matcher, make, model, year, body_type, fuel_type, transmission,
|
| 23 |
odometer, doors, seats, engine_size, power, cylinders,
|
| 24 |
safety_rating, drive_type, segment, condition, selected_model):
|
| 25 |
"""Interface function for detailed Gradio prediction"""
|
| 26 |
+
# Handle placeholder values - convert to None for backend processing
|
| 27 |
+
processed_make = None if make == "Select Make" else make
|
| 28 |
+
processed_model = None if model == "ALL" else model # Convert ALL to None for all models
|
| 29 |
+
processed_body_type = None if body_type == "Select Body Type" else body_type
|
| 30 |
+
processed_fuel_type = None if fuel_type == "Select Fuel Type" else fuel_type
|
| 31 |
+
processed_transmission = None if transmission == "Select Transmission" else transmission
|
| 32 |
+
processed_drive_type = None if drive_type == "Select Drive Type" else drive_type
|
| 33 |
+
processed_segment = None if segment == "Select Segment" else segment
|
| 34 |
+
processed_condition = None if condition == "Select Condition" else condition
|
| 35 |
+
processed_selected_model = None if selected_model == "Select AI Model" else selected_model
|
| 36 |
+
|
| 37 |
+
return matcher.predict_dealers(processed_make, processed_model, year, processed_body_type,
|
| 38 |
+
processed_fuel_type, processed_transmission, odometer, doors,
|
| 39 |
+
seats, engine_size, power, cylinders, safety_rating,
|
| 40 |
+
processed_drive_type, processed_segment, processed_condition,
|
| 41 |
+
processed_selected_model)
|
| 42 |
|
| 43 |
|
| 44 |
def simple_predict_dealers_interface(matcher, simple_make, simple_model, simple_year,
|
| 45 |
simple_odometer, simple_model_selection):
|
| 46 |
"""Simple interface function for Gradio with conditional parameters"""
|
| 47 |
+
# Handle placeholder values - convert to None for backend processing
|
| 48 |
+
processed_make = None if simple_make == "Select Make" else simple_make
|
| 49 |
+
processed_model = None if simple_model == "ALL" else simple_model # Convert ALL to None for all models
|
| 50 |
+
processed_model_selection = None if simple_model_selection == "Select AI Model" else simple_model_selection
|
| 51 |
|
| 52 |
return matcher.predict_dealers(
|
| 53 |
+
make=processed_make,
|
| 54 |
+
model=processed_model,
|
| 55 |
year=simple_year,
|
| 56 |
body_type=None,
|
| 57 |
fuel_type=None,
|
|
|
|
| 66 |
drive_type=None,
|
| 67 |
segment=None,
|
| 68 |
condition=None,
|
| 69 |
+
selected_model=processed_model_selection
|
| 70 |
)
|
| 71 |
|
| 72 |
|
| 73 |
+
def search_data_interface(matcher, keyword_search, make, model, year_from, year_to, body_type, fuel_type,
|
| 74 |
+
odometer_from, odometer_to, max_price, selected_file, max_results, show_dealer_stats):
|
| 75 |
"""Interface function for traditional data search"""
|
| 76 |
+
# Handle placeholder values - convert to None for backend processing
|
| 77 |
+
processed_make = None if make == "Select Make" else make
|
| 78 |
+
processed_model = None if model == "ALL" else model # Convert ALL to None for all models
|
| 79 |
+
processed_body_type = None if body_type == "Select Body Type" else body_type
|
| 80 |
+
processed_fuel_type = None if fuel_type == "Select Fuel Type" else fuel_type
|
| 81 |
+
processed_selected_file = None if selected_file == "Select File" else selected_file
|
| 82 |
+
|
| 83 |
+
message, result_data = matcher.search_data_files(keyword_search=keyword_search, make=processed_make,
|
| 84 |
+
model=processed_model, year_min=None, year_max=None,
|
| 85 |
+
year_from=year_from, year_to=year_to,
|
| 86 |
+
body_type=processed_body_type, fuel_type=processed_fuel_type,
|
| 87 |
+
max_odometer=None, odometer_from=odometer_from,
|
| 88 |
+
odometer_to=odometer_to, max_price=max_price,
|
| 89 |
+
selected_file=processed_selected_file,
|
| 90 |
max_results=max_results, show_dealer_stats=show_dealer_stats)
|
| 91 |
|
| 92 |
if isinstance(result_data, pd.DataFrame) and result_data.empty:
|
|
|
|
| 111 |
return message, "No results to display", ""
|
| 112 |
|
| 113 |
|
| 114 |
+
def simple_search_data_interface(matcher, keyword_search, make, model, year_from, year_to, odometer_from, odometer_to, selected_file,
|
| 115 |
max_results, show_dealer_stats):
|
| 116 |
"""Interface function for simple traditional data search"""
|
| 117 |
+
# Handle placeholder values - convert to None for backend processing
|
| 118 |
+
processed_make = None if make == "Select Make" else make
|
| 119 |
+
processed_model = None if model == "ALL" else model # Convert ALL to None for all models
|
| 120 |
+
processed_selected_file = None if selected_file == "Select File" else selected_file
|
| 121 |
|
| 122 |
message, result_data = matcher.search_data_files(
|
| 123 |
keyword_search=keyword_search,
|
| 124 |
+
make=processed_make,
|
| 125 |
+
model=processed_model,
|
| 126 |
year_min=None,
|
| 127 |
year_max=None,
|
| 128 |
+
year_from=year_from,
|
| 129 |
+
year_to=year_to,
|
| 130 |
body_type=None, # Not used in simple search
|
| 131 |
fuel_type=None, # Not used in simple search
|
| 132 |
max_odometer=None, # Not using max_odometer anymore
|
| 133 |
+
odometer_from=odometer_from,
|
| 134 |
+
odometer_to=odometer_to,
|
| 135 |
max_price=None, # Not used in simple search
|
| 136 |
+
selected_file=processed_selected_file,
|
| 137 |
max_results=max_results,
|
| 138 |
show_dealer_stats=show_dealer_stats
|
| 139 |
)
|
ui/tabs/detailed_tab.py
CHANGED
|
@@ -18,10 +18,11 @@ def create_detailed_tab(matcher):
|
|
| 18 |
|
| 19 |
# Model Selection Section
|
| 20 |
with gr.Row():
|
|
|
|
| 21 |
model_selection = gr.Dropdown(
|
| 22 |
-
choices=
|
| 23 |
label="π€ Select AI Model",
|
| 24 |
-
value=
|
| 25 |
info="WeightedEnsemble_L3 provides the best overall performance",
|
| 26 |
scale=2
|
| 27 |
)
|
|
@@ -40,15 +41,16 @@ def create_detailed_tab(matcher):
|
|
| 40 |
with gr.Column(scale=1):
|
| 41 |
gr.Markdown("### π Basic Vehicle Information")
|
| 42 |
|
|
|
|
| 43 |
make = gr.Dropdown(
|
| 44 |
-
choices=
|
| 45 |
label="Make",
|
| 46 |
-
value=
|
| 47 |
)
|
| 48 |
model = gr.Dropdown(
|
| 49 |
-
choices=
|
| 50 |
label="Model",
|
| 51 |
-
value=
|
| 52 |
)
|
| 53 |
year = gr.Number(
|
| 54 |
label="Year",
|
|
@@ -56,25 +58,28 @@ def create_detailed_tab(matcher):
|
|
| 56 |
minimum=1990,
|
| 57 |
maximum=2025
|
| 58 |
)
|
|
|
|
| 59 |
condition = gr.Dropdown(
|
| 60 |
-
choices=
|
| 61 |
label="Condition",
|
| 62 |
-
value=
|
| 63 |
)
|
| 64 |
|
| 65 |
# Body & Style
|
| 66 |
with gr.Column(scale=1):
|
| 67 |
gr.Markdown("### ποΈ Body & Style")
|
| 68 |
|
|
|
|
| 69 |
body_type = gr.Dropdown(
|
| 70 |
-
choices=
|
| 71 |
label="Body Type",
|
| 72 |
-
value=
|
| 73 |
)
|
|
|
|
| 74 |
segment = gr.Dropdown(
|
| 75 |
-
choices=
|
| 76 |
label="Vehicle Segment",
|
| 77 |
-
value=
|
| 78 |
)
|
| 79 |
doors = gr.Number(
|
| 80 |
label="Doors",
|
|
@@ -93,15 +98,17 @@ def create_detailed_tab(matcher):
|
|
| 93 |
with gr.Column(scale=1):
|
| 94 |
gr.Markdown("### β‘ Engine & Performance")
|
| 95 |
|
|
|
|
| 96 |
fuel_type = gr.Dropdown(
|
| 97 |
-
choices=
|
| 98 |
label="Fuel Type",
|
| 99 |
-
value=
|
| 100 |
)
|
|
|
|
| 101 |
transmission = gr.Dropdown(
|
| 102 |
-
choices=
|
| 103 |
label="Transmission",
|
| 104 |
-
value=
|
| 105 |
)
|
| 106 |
engine_size = gr.Number(
|
| 107 |
label="Engine Size (L)",
|
|
@@ -127,10 +134,11 @@ def create_detailed_tab(matcher):
|
|
| 127 |
minimum=50,
|
| 128 |
maximum=1000
|
| 129 |
)
|
|
|
|
| 130 |
drive_type = gr.Dropdown(
|
| 131 |
-
choices=
|
| 132 |
label="Drive Type",
|
| 133 |
-
value=
|
| 134 |
)
|
| 135 |
safety_rating = gr.Number(
|
| 136 |
label="Safety Rating (1-5)",
|
|
|
|
| 18 |
|
| 19 |
# Model Selection Section
|
| 20 |
with gr.Row():
|
| 21 |
+
ai_model_choices = ["Select AI Model"] + (matcher.available_models if matcher.model_loaded else ['Model not loaded'])
|
| 22 |
model_selection = gr.Dropdown(
|
| 23 |
+
choices=ai_model_choices,
|
| 24 |
label="π€ Select AI Model",
|
| 25 |
+
value="Select AI Model",
|
| 26 |
info="WeightedEnsemble_L3 provides the best overall performance",
|
| 27 |
scale=2
|
| 28 |
)
|
|
|
|
| 41 |
with gr.Column(scale=1):
|
| 42 |
gr.Markdown("### π Basic Vehicle Information")
|
| 43 |
|
| 44 |
+
make_choices = ["Select Make"] + CAR_MAKES
|
| 45 |
make = gr.Dropdown(
|
| 46 |
+
choices=make_choices,
|
| 47 |
label="Make",
|
| 48 |
+
value="Select Make"
|
| 49 |
)
|
| 50 |
model = gr.Dropdown(
|
| 51 |
+
choices=["ALL"],
|
| 52 |
label="Model",
|
| 53 |
+
value="ALL"
|
| 54 |
)
|
| 55 |
year = gr.Number(
|
| 56 |
label="Year",
|
|
|
|
| 58 |
minimum=1990,
|
| 59 |
maximum=2025
|
| 60 |
)
|
| 61 |
+
condition_choices = ["Select Condition"] + CONDITIONS
|
| 62 |
condition = gr.Dropdown(
|
| 63 |
+
choices=condition_choices,
|
| 64 |
label="Condition",
|
| 65 |
+
value="Select Condition"
|
| 66 |
)
|
| 67 |
|
| 68 |
# Body & Style
|
| 69 |
with gr.Column(scale=1):
|
| 70 |
gr.Markdown("### ποΈ Body & Style")
|
| 71 |
|
| 72 |
+
body_type_choices = ["Select Body Type"] + BODY_TYPES
|
| 73 |
body_type = gr.Dropdown(
|
| 74 |
+
choices=body_type_choices,
|
| 75 |
label="Body Type",
|
| 76 |
+
value="Select Body Type"
|
| 77 |
)
|
| 78 |
+
segment_choices = ["Select Segment"] + SEGMENTS
|
| 79 |
segment = gr.Dropdown(
|
| 80 |
+
choices=segment_choices,
|
| 81 |
label="Vehicle Segment",
|
| 82 |
+
value="Select Segment"
|
| 83 |
)
|
| 84 |
doors = gr.Number(
|
| 85 |
label="Doors",
|
|
|
|
| 98 |
with gr.Column(scale=1):
|
| 99 |
gr.Markdown("### β‘ Engine & Performance")
|
| 100 |
|
| 101 |
+
fuel_type_choices = ["Select Fuel Type"] + FUEL_TYPES
|
| 102 |
fuel_type = gr.Dropdown(
|
| 103 |
+
choices=fuel_type_choices,
|
| 104 |
label="Fuel Type",
|
| 105 |
+
value="Select Fuel Type"
|
| 106 |
)
|
| 107 |
+
transmission_choices = ["Select Transmission"] + TRANSMISSION_TYPES
|
| 108 |
transmission = gr.Dropdown(
|
| 109 |
+
choices=transmission_choices,
|
| 110 |
label="Transmission",
|
| 111 |
+
value="Select Transmission"
|
| 112 |
)
|
| 113 |
engine_size = gr.Number(
|
| 114 |
label="Engine Size (L)",
|
|
|
|
| 134 |
minimum=50,
|
| 135 |
maximum=1000
|
| 136 |
)
|
| 137 |
+
drive_type_choices = ["Select Drive Type"] + DRIVE_TYPES
|
| 138 |
drive_type = gr.Dropdown(
|
| 139 |
+
choices=drive_type_choices,
|
| 140 |
label="Drive Type",
|
| 141 |
+
value="Select Drive Type"
|
| 142 |
)
|
| 143 |
safety_rating = gr.Number(
|
| 144 |
label="Safety Rating (1-5)",
|
ui/tabs/simple_search_tab.py
CHANGED
|
@@ -16,10 +16,11 @@ def create_simple_search_tab(matcher):
|
|
| 16 |
with gr.Row():
|
| 17 |
with gr.Column(scale=1):
|
| 18 |
gr.Markdown("### ποΈ File & Options")
|
|
|
|
| 19 |
simple_search_file = gr.Dropdown(
|
| 20 |
-
choices=
|
| 21 |
label="Select CSV File",
|
| 22 |
-
value=
|
| 23 |
info=f"Available files: {len(matcher.data_files)}"
|
| 24 |
)
|
| 25 |
|
|
@@ -50,50 +51,48 @@ def create_simple_search_tab(matcher):
|
|
| 50 |
gr.Markdown("#### Specific Filters")
|
| 51 |
|
| 52 |
with gr.Row():
|
|
|
|
| 53 |
simple_search_make = gr.Dropdown(
|
| 54 |
-
choices=
|
| 55 |
label="Make",
|
| 56 |
-
value=
|
| 57 |
info="Select car manufacturer"
|
| 58 |
)
|
| 59 |
simple_search_model = gr.Dropdown(
|
| 60 |
-
choices=
|
| 61 |
label="Model",
|
| 62 |
-
value=
|
| 63 |
info="Select car model"
|
| 64 |
)
|
| 65 |
|
| 66 |
with gr.Row():
|
| 67 |
-
|
| 68 |
-
label="
|
| 69 |
-
value=DEFAULT_VALUES['year'],
|
| 70 |
minimum=1990,
|
| 71 |
maximum=2025,
|
| 72 |
-
info="
|
| 73 |
)
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
info="Range around target year"
|
| 81 |
)
|
| 82 |
|
| 83 |
with gr.Row():
|
| 84 |
-
|
| 85 |
-
label="
|
| 86 |
-
value=
|
| 87 |
minimum=0,
|
| 88 |
-
info="
|
| 89 |
)
|
| 90 |
-
|
|
|
|
|
|
|
| 91 |
minimum=0,
|
| 92 |
-
|
| 93 |
-
value=20000,
|
| 94 |
-
step=1000,
|
| 95 |
-
label="Odometer Range (Β±km)",
|
| 96 |
-
info="Range around target (Β±km)"
|
| 97 |
)
|
| 98 |
|
| 99 |
# Simple traditional search button
|
|
@@ -103,6 +102,14 @@ def create_simple_search_tab(matcher):
|
|
| 103 |
size="lg"
|
| 104 |
)
|
| 105 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 106 |
# Simple Traditional Search Results Section
|
| 107 |
with gr.Row():
|
| 108 |
simple_search_status = gr.Textbox(
|
|
@@ -128,21 +135,39 @@ def create_simple_search_tab(matcher):
|
|
| 128 |
### π― Simple Search Features
|
| 129 |
|
| 130 |
**π Keyword Search:** General search across all text fields (make, model, dealer name, location, etc.)
|
| 131 |
-
**Quick Setup:** Just select make, model,
|
| 132 |
**Smart Defaults:** Pre-filled with popular choices
|
| 133 |
-
**π― Year Range:** Set
|
| 134 |
-
**π― Odometer Range:** Set
|
| 135 |
**Same Power:** Uses the same CSV search engine as Traditional Search
|
| 136 |
**Dealer Ranking:** Get dealers ranked by inventory matching your criteria
|
| 137 |
**Fast Results:** Simplified interface for quicker searches
|
|
|
|
| 138 |
""")
|
| 139 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
return {
|
| 141 |
-
'inputs': [simple_keyword_search, simple_search_make, simple_search_model,
|
| 142 |
-
|
| 143 |
simple_show_dealer_stats],
|
| 144 |
'outputs': [simple_search_status, simple_search_info, simple_search_results_table],
|
| 145 |
'button': simple_search_btn,
|
|
|
|
|
|
|
| 146 |
'make_dropdown': simple_search_make,
|
| 147 |
'model_dropdown': simple_search_model
|
| 148 |
}
|
|
|
|
| 16 |
with gr.Row():
|
| 17 |
with gr.Column(scale=1):
|
| 18 |
gr.Markdown("### ποΈ File & Options")
|
| 19 |
+
file_choices = ["Select File"] + matcher.data_files
|
| 20 |
simple_search_file = gr.Dropdown(
|
| 21 |
+
choices=file_choices,
|
| 22 |
label="Select CSV File",
|
| 23 |
+
value="Select File",
|
| 24 |
info=f"Available files: {len(matcher.data_files)}"
|
| 25 |
)
|
| 26 |
|
|
|
|
| 51 |
gr.Markdown("#### Specific Filters")
|
| 52 |
|
| 53 |
with gr.Row():
|
| 54 |
+
make_choices = ["Select Make"] + CAR_MAKES
|
| 55 |
simple_search_make = gr.Dropdown(
|
| 56 |
+
choices=make_choices,
|
| 57 |
label="Make",
|
| 58 |
+
value="Select Make",
|
| 59 |
info="Select car manufacturer"
|
| 60 |
)
|
| 61 |
simple_search_model = gr.Dropdown(
|
| 62 |
+
choices=["ALL"],
|
| 63 |
label="Model",
|
| 64 |
+
value="ALL",
|
| 65 |
info="Select car model"
|
| 66 |
)
|
| 67 |
|
| 68 |
with gr.Row():
|
| 69 |
+
simple_year_from = gr.Number(
|
| 70 |
+
label="Year From",
|
| 71 |
+
value=DEFAULT_VALUES['year'] - 1,
|
| 72 |
minimum=1990,
|
| 73 |
maximum=2025,
|
| 74 |
+
info="Minimum manufacturing year"
|
| 75 |
)
|
| 76 |
+
simple_year_to = gr.Number(
|
| 77 |
+
label="Year To",
|
| 78 |
+
value=DEFAULT_VALUES['year'] + 1,
|
| 79 |
+
minimum=1990,
|
| 80 |
+
maximum=2025,
|
| 81 |
+
info="Maximum manufacturing year"
|
|
|
|
| 82 |
)
|
| 83 |
|
| 84 |
with gr.Row():
|
| 85 |
+
simple_odometer_from = gr.Number(
|
| 86 |
+
label="Odometer From (km)",
|
| 87 |
+
value=45000,
|
| 88 |
minimum=0,
|
| 89 |
+
info="Minimum odometer reading"
|
| 90 |
)
|
| 91 |
+
simple_odometer_to = gr.Number(
|
| 92 |
+
label="Odometer To (km)",
|
| 93 |
+
value=85000,
|
| 94 |
minimum=0,
|
| 95 |
+
info="Maximum odometer reading"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
)
|
| 97 |
|
| 98 |
# Simple traditional search button
|
|
|
|
| 102 |
size="lg"
|
| 103 |
)
|
| 104 |
|
| 105 |
+
with gr.Row():
|
| 106 |
+
# Reset button
|
| 107 |
+
simple_reset_btn = gr.Button(
|
| 108 |
+
"π Reset to Defaults",
|
| 109 |
+
variant="secondary",
|
| 110 |
+
size="sm"
|
| 111 |
+
)
|
| 112 |
+
|
| 113 |
# Simple Traditional Search Results Section
|
| 114 |
with gr.Row():
|
| 115 |
simple_search_status = gr.Textbox(
|
|
|
|
| 135 |
### π― Simple Search Features
|
| 136 |
|
| 137 |
**π Keyword Search:** General search across all text fields (make, model, dealer name, location, etc.)
|
| 138 |
+
**Quick Setup:** Just select make, model, year range (from-to), and odometer range (from-to)
|
| 139 |
**Smart Defaults:** Pre-filled with popular choices
|
| 140 |
+
**π― Year Range:** Set minimum and maximum manufacturing years (e.g., 2019 to 2021)
|
| 141 |
+
**π― Odometer Range:** Set minimum and maximum odometer readings (e.g., 45,000 to 85,000 km)
|
| 142 |
**Same Power:** Uses the same CSV search engine as Traditional Search
|
| 143 |
**Dealer Ranking:** Get dealers ranked by inventory matching your criteria
|
| 144 |
**Fast Results:** Simplified interface for quicker searches
|
| 145 |
+
**π Reset Button:** Quickly restore all fields to their default values
|
| 146 |
""")
|
| 147 |
|
| 148 |
+
def reset_simple_search():
|
| 149 |
+
"""Reset all simple search fields to default values"""
|
| 150 |
+
return (
|
| 151 |
+
"", # simple_keyword_search
|
| 152 |
+
"Select Make", # simple_search_make
|
| 153 |
+
"ALL", # simple_search_model
|
| 154 |
+
DEFAULT_VALUES['year'] - 1, # simple_year_from
|
| 155 |
+
DEFAULT_VALUES['year'] + 1, # simple_year_to
|
| 156 |
+
45000, # simple_odometer_from
|
| 157 |
+
85000, # simple_odometer_to
|
| 158 |
+
"Select File", # simple_search_file
|
| 159 |
+
DEFAULT_VALUES['max_results'], # simple_max_results
|
| 160 |
+
True, # simple_show_dealer_stats
|
| 161 |
+
)
|
| 162 |
+
|
| 163 |
return {
|
| 164 |
+
'inputs': [simple_keyword_search, simple_search_make, simple_search_model, simple_year_from, simple_year_to,
|
| 165 |
+
simple_odometer_from, simple_odometer_to, simple_search_file, simple_max_results,
|
| 166 |
simple_show_dealer_stats],
|
| 167 |
'outputs': [simple_search_status, simple_search_info, simple_search_results_table],
|
| 168 |
'button': simple_search_btn,
|
| 169 |
+
'reset_button': simple_reset_btn,
|
| 170 |
+
'reset_function': reset_simple_search,
|
| 171 |
'make_dropdown': simple_search_make,
|
| 172 |
'model_dropdown': simple_search_model
|
| 173 |
}
|
ui/tabs/simple_tab.py
CHANGED
|
@@ -14,25 +14,27 @@ def create_simple_tab(simple_matcher):
|
|
| 14 |
gr.Markdown("Enter just the basic details for a quick recommendation")
|
| 15 |
|
| 16 |
# Model Selection for Simple Tab
|
|
|
|
| 17 |
simple_model_selection = gr.Dropdown(
|
| 18 |
-
choices=
|
| 19 |
label="π€ Select AI Model",
|
| 20 |
-
value=
|
| 21 |
info="WeightedEnsemble_L3 provides the best overall performance"
|
| 22 |
)
|
| 23 |
|
| 24 |
with gr.Row():
|
| 25 |
# Basic inputs
|
| 26 |
with gr.Column(scale=1):
|
|
|
|
| 27 |
simple_make = gr.Dropdown(
|
| 28 |
-
choices=
|
| 29 |
label="Make",
|
| 30 |
-
value=
|
| 31 |
)
|
| 32 |
simple_model = gr.Dropdown(
|
| 33 |
-
choices=
|
| 34 |
label="Model",
|
| 35 |
-
value=
|
| 36 |
)
|
| 37 |
|
| 38 |
with gr.Column(scale=1):
|
|
|
|
| 14 |
gr.Markdown("Enter just the basic details for a quick recommendation")
|
| 15 |
|
| 16 |
# Model Selection for Simple Tab
|
| 17 |
+
ai_model_choices = ["Select AI Model"] + (simple_matcher.available_models if simple_matcher.model_loaded else ['Model not loaded'])
|
| 18 |
simple_model_selection = gr.Dropdown(
|
| 19 |
+
choices=ai_model_choices,
|
| 20 |
label="π€ Select AI Model",
|
| 21 |
+
value="Select AI Model",
|
| 22 |
info="WeightedEnsemble_L3 provides the best overall performance"
|
| 23 |
)
|
| 24 |
|
| 25 |
with gr.Row():
|
| 26 |
# Basic inputs
|
| 27 |
with gr.Column(scale=1):
|
| 28 |
+
make_choices = ["Select Make"] + CAR_MAKES
|
| 29 |
simple_make = gr.Dropdown(
|
| 30 |
+
choices=make_choices,
|
| 31 |
label="Make",
|
| 32 |
+
value="Select Make"
|
| 33 |
)
|
| 34 |
simple_model = gr.Dropdown(
|
| 35 |
+
choices=["ALL"],
|
| 36 |
label="Model",
|
| 37 |
+
value="ALL"
|
| 38 |
)
|
| 39 |
|
| 40 |
with gr.Column(scale=1):
|
ui/tabs/traditional_tab.py
CHANGED
|
@@ -16,10 +16,11 @@ def create_traditional_tab(matcher):
|
|
| 16 |
with gr.Row():
|
| 17 |
with gr.Column(scale=1):
|
| 18 |
gr.Markdown("### ποΈ File Selection")
|
|
|
|
| 19 |
selected_file = gr.Dropdown(
|
| 20 |
-
choices=
|
| 21 |
label="Select CSV File",
|
| 22 |
-
value=
|
| 23 |
info=f"Available files: {len(matcher.data_files)}"
|
| 24 |
)
|
| 25 |
|
|
@@ -62,20 +63,19 @@ def create_traditional_tab(matcher):
|
|
| 62 |
)
|
| 63 |
|
| 64 |
with gr.Row():
|
| 65 |
-
|
| 66 |
-
label="
|
| 67 |
-
value=DEFAULT_VALUES['year'],
|
| 68 |
minimum=1980,
|
| 69 |
maximum=2025,
|
| 70 |
-
info="
|
| 71 |
)
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
info="Range around target year (e.g., Β±2 years)"
|
| 79 |
)
|
| 80 |
|
| 81 |
with gr.Row():
|
|
@@ -91,19 +91,17 @@ def create_traditional_tab(matcher):
|
|
| 91 |
)
|
| 92 |
|
| 93 |
with gr.Row():
|
| 94 |
-
|
| 95 |
-
label="
|
| 96 |
-
value=
|
| 97 |
minimum=0,
|
| 98 |
-
info="
|
| 99 |
)
|
| 100 |
-
|
|
|
|
|
|
|
| 101 |
minimum=0,
|
| 102 |
-
|
| 103 |
-
value=25000,
|
| 104 |
-
step=1000,
|
| 105 |
-
label="Odometer Range (Β±km)",
|
| 106 |
-
info="Range around target (e.g., Β±25,000 km)"
|
| 107 |
)
|
| 108 |
|
| 109 |
with gr.Row():
|
|
@@ -120,6 +118,14 @@ def create_traditional_tab(matcher):
|
|
| 120 |
size="lg"
|
| 121 |
)
|
| 122 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
# Traditional Search Results Section
|
| 124 |
with gr.Row():
|
| 125 |
search_status = gr.Textbox(
|
|
@@ -155,15 +161,15 @@ def create_traditional_tab(matcher):
|
|
| 155 |
**π Keyword Search:** General search across all text fields (make, model, dealer name, location, etc.)
|
| 156 |
**π Dealer Ranking:** Dealers ranked by number of cars matching your criteria
|
| 157 |
**π Inventory Priority:** Dealers with more matching inventory appear first
|
| 158 |
-
**π― Year Range Search:** Set
|
| 159 |
-
**π― Odometer Range Search:** Set
|
| 160 |
**π Column Mapping:** Uses actual dataset columns:
|
| 161 |
- **Make/Model:** `make`, `model`
|
| 162 |
-
- **Year:** `manu_year` (searchable by
|
| 163 |
- **Body Type:** `vehicle_body_type`
|
| 164 |
- **Fuel Type:** `vehicle_fuel_type`
|
| 165 |
- **Transmission:** `vehicle_transmission_type`
|
| 166 |
-
- **Mileage:** `odometer` (searchable by
|
| 167 |
- **Price:** `advertised_price`
|
| 168 |
- **Dealer:** `dealer_trading_name`
|
| 169 |
- **Location:** `dealer_city`, `dealer_state`
|
|
@@ -174,11 +180,32 @@ def create_traditional_tab(matcher):
|
|
| 174 |
**Ranking Logic:** Dealers with more matching cars get better ranks (Rank 1 = most inventory)
|
| 175 |
**Sorting:** Results sorted by dealer inventory count first, then by price
|
| 176 |
**Performance:** Fast counting using pandas group operations
|
|
|
|
| 177 |
""")
|
| 178 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 179 |
return {
|
| 180 |
-
'inputs': [keyword_search, search_make, search_model,
|
| 181 |
-
search_fuel_type,
|
| 182 |
'outputs': [search_status, search_info, search_results_table],
|
| 183 |
-
'button': search_btn
|
|
|
|
|
|
|
| 184 |
}
|
|
|
|
| 16 |
with gr.Row():
|
| 17 |
with gr.Column(scale=1):
|
| 18 |
gr.Markdown("### ποΈ File Selection")
|
| 19 |
+
file_choices = ["Select File"] + matcher.data_files
|
| 20 |
selected_file = gr.Dropdown(
|
| 21 |
+
choices=file_choices,
|
| 22 |
label="Select CSV File",
|
| 23 |
+
value="Select File",
|
| 24 |
info=f"Available files: {len(matcher.data_files)}"
|
| 25 |
)
|
| 26 |
|
|
|
|
| 63 |
)
|
| 64 |
|
| 65 |
with gr.Row():
|
| 66 |
+
year_from = gr.Number(
|
| 67 |
+
label="Year From",
|
| 68 |
+
value=DEFAULT_VALUES['year'] - 2,
|
| 69 |
minimum=1980,
|
| 70 |
maximum=2025,
|
| 71 |
+
info="Minimum manufacturing year"
|
| 72 |
)
|
| 73 |
+
year_to = gr.Number(
|
| 74 |
+
label="Year To",
|
| 75 |
+
value=DEFAULT_VALUES['year'] + 2,
|
| 76 |
+
minimum=1980,
|
| 77 |
+
maximum=2025,
|
| 78 |
+
info="Maximum manufacturing year"
|
|
|
|
| 79 |
)
|
| 80 |
|
| 81 |
with gr.Row():
|
|
|
|
| 91 |
)
|
| 92 |
|
| 93 |
with gr.Row():
|
| 94 |
+
odometer_from = gr.Number(
|
| 95 |
+
label="Odometer From (km)",
|
| 96 |
+
value=50000,
|
| 97 |
minimum=0,
|
| 98 |
+
info="Minimum odometer reading"
|
| 99 |
)
|
| 100 |
+
odometer_to = gr.Number(
|
| 101 |
+
label="Odometer To (km)",
|
| 102 |
+
value=100000,
|
| 103 |
minimum=0,
|
| 104 |
+
info="Maximum odometer reading"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
)
|
| 106 |
|
| 107 |
with gr.Row():
|
|
|
|
| 118 |
size="lg"
|
| 119 |
)
|
| 120 |
|
| 121 |
+
with gr.Row():
|
| 122 |
+
# Reset button
|
| 123 |
+
reset_btn = gr.Button(
|
| 124 |
+
"π Reset to Defaults",
|
| 125 |
+
variant="secondary",
|
| 126 |
+
size="sm"
|
| 127 |
+
)
|
| 128 |
+
|
| 129 |
# Traditional Search Results Section
|
| 130 |
with gr.Row():
|
| 131 |
search_status = gr.Textbox(
|
|
|
|
| 161 |
**π Keyword Search:** General search across all text fields (make, model, dealer name, location, etc.)
|
| 162 |
**π Dealer Ranking:** Dealers ranked by number of cars matching your criteria
|
| 163 |
**π Inventory Priority:** Dealers with more matching inventory appear first
|
| 164 |
+
**π― Year Range Search:** Set minimum and maximum manufacturing years (e.g., 2018 to 2022)
|
| 165 |
+
**π― Odometer Range Search:** Set minimum and maximum odometer readings (e.g., 50,000 to 100,000 km)
|
| 166 |
**π Column Mapping:** Uses actual dataset columns:
|
| 167 |
- **Make/Model:** `make`, `model`
|
| 168 |
+
- **Year:** `manu_year` (searchable by from-to range)
|
| 169 |
- **Body Type:** `vehicle_body_type`
|
| 170 |
- **Fuel Type:** `vehicle_fuel_type`
|
| 171 |
- **Transmission:** `vehicle_transmission_type`
|
| 172 |
+
- **Mileage:** `odometer` (searchable by from-to range)
|
| 173 |
- **Price:** `advertised_price`
|
| 174 |
- **Dealer:** `dealer_trading_name`
|
| 175 |
- **Location:** `dealer_city`, `dealer_state`
|
|
|
|
| 180 |
**Ranking Logic:** Dealers with more matching cars get better ranks (Rank 1 = most inventory)
|
| 181 |
**Sorting:** Results sorted by dealer inventory count first, then by price
|
| 182 |
**Performance:** Fast counting using pandas group operations
|
| 183 |
+
**π Reset Button:** Quickly restore all fields to their default values
|
| 184 |
""")
|
| 185 |
|
| 186 |
+
def reset_traditional_search():
|
| 187 |
+
"""Reset all traditional search fields to default values"""
|
| 188 |
+
return (
|
| 189 |
+
"", # keyword_search
|
| 190 |
+
"", # search_make
|
| 191 |
+
"", # search_model
|
| 192 |
+
DEFAULT_VALUES['year'] - 2, # year_from
|
| 193 |
+
DEFAULT_VALUES['year'] + 2, # year_to
|
| 194 |
+
"", # search_body_type
|
| 195 |
+
"", # search_fuel_type
|
| 196 |
+
50000, # odometer_from
|
| 197 |
+
100000, # odometer_to
|
| 198 |
+
None, # max_price
|
| 199 |
+
"Select File", # selected_file
|
| 200 |
+
DEFAULT_VALUES['max_results'], # max_results
|
| 201 |
+
True, # show_dealer_stats
|
| 202 |
+
)
|
| 203 |
+
|
| 204 |
return {
|
| 205 |
+
'inputs': [keyword_search, search_make, search_model, year_from, year_to, search_body_type,
|
| 206 |
+
search_fuel_type, odometer_from, odometer_to, max_price, selected_file, max_results, show_dealer_stats],
|
| 207 |
'outputs': [search_status, search_info, search_results_table],
|
| 208 |
+
'button': search_btn,
|
| 209 |
+
'reset_button': reset_btn,
|
| 210 |
+
'reset_function': reset_traditional_search
|
| 211 |
}
|
utils/helpers.py
CHANGED
|
@@ -106,4 +106,19 @@ def setup_event_handlers(tabs_data, interface_functions, matchers):
|
|
| 106 |
fn=interface_functions['update_models'],
|
| 107 |
inputs=simple_search_tab['make_dropdown'],
|
| 108 |
outputs=simple_search_tab['model_dropdown']
|
| 109 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 106 |
fn=interface_functions['update_models'],
|
| 107 |
inputs=simple_search_tab['make_dropdown'],
|
| 108 |
outputs=simple_search_tab['model_dropdown']
|
| 109 |
+
)
|
| 110 |
+
|
| 111 |
+
# Reset buttons
|
| 112 |
+
if 'reset_button' in simple_search_tab:
|
| 113 |
+
simple_search_tab['reset_button'].click(
|
| 114 |
+
fn=simple_search_tab['reset_function'],
|
| 115 |
+
inputs=[],
|
| 116 |
+
outputs=simple_search_tab['inputs']
|
| 117 |
+
)
|
| 118 |
+
|
| 119 |
+
if 'reset_button' in traditional_tab:
|
| 120 |
+
traditional_tab['reset_button'].click(
|
| 121 |
+
fn=traditional_tab['reset_function'],
|
| 122 |
+
inputs=[],
|
| 123 |
+
outputs=traditional_tab['inputs']
|
| 124 |
+
)
|