Repository: kaspersgit/ml_2_sql (language: python)

Issue:
Bump pillow from 9.1.1 to 9.3.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.1.1 to 9.3.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/9.1.1...9.3.0)

---
updated-dependencies:
- dependency-name: pillow dependency-type: direct:production ...

Signed-off-by: dependabot[bot] <support@github.com>


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index 2999d25..0a5c56b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,9 @@
 # files and data
 input/data/*.csv
-!input/data/example_binary_titanic.csv
-!input/data/example_multiclass_faults.csv
+!input/data/example_*.csv
 
 input/configuration/*.json
-!input/configuration/example_binary_titanic.json
-!input/configuration/example_multiclass_faults.json
+!input/configuration/example_*.json
 
 trained_models/*
 !trained_models/example_titanic/
diff --git a/Readme.md b/Readme.md
index 0a0579a..c4abca6 100644
--- a/Readme.md
+++ b/Readme.md
@@ -18,20 +18,13 @@ This project tries to make the process simple enough for any SQL user to train a
 
 ## Philosophy:
 - Automated and easy to use 
-- Model in SQL (avoid Data Science debt for a complex pipeline)
+- Model written in SQL (avoid Data Science debt for a complex pipeline)
 - Explainable Boosting Machine on par with other boosted methods
 
 ## Background
 An automated machine learning tool which trains, graphs performance and saves the model in SQL. Using interpretable ML models (from interpretML) to train models which are explainable and transparent in how they come to their prediction. SQL infrastructure is the only requirement to put a model into production.
 This tool can be used by anybody, but is aimed for people who want to easily train a model and want to use it in their (company) SQL system. 
 
-## Current state
-- Only EBM is implemented (decision tree, logistic regression and rule set not yet)
-- Automated model training is working for binary classification and regression
-- SQL creation of model is working fully for binary clasification
-- SQL for regression and the whole process for multiclass classification is work in progress
-- Up/down sampling not fully implemented yet 
-
 </br>
 
 # Getting started
@@ -59,18 +52,18 @@ This tool can be used by anybody, but is aimed for people who want to easily tra
    
     Mac/Linux:
    `source .ml2sql/bin/activate` or `deactivate`
-4. For usage of this tool the virtual environment can be deactivated.
+4. For usage of this tool the virtual environment does not need to be activated.
 
 ## Try it out demo
 1. In the terminal in the root of this folder run: 
   - `python3 run.py` (Mac/Linux)
   - `python run.py` (Windows)
-2. Follow the instructions on screen by selecting the demo data and (similarly named) config file
+2. Follow the instructions on screen by selecting the example data and config file
 3. Check the output in the newly created folder
 
 ## Try it out using own data
 1. Save csv file containing target and all features in the `input/data/` folder (more on input data at [input data](#data))
-2. Save a settings json file in the `input/configuration/` (explained below at [configuration json](#configuration-json))
+2. Save a configuration json file in the `input/configuration/` (explained below at [configuration json](#configuration-json))
 3. In the terminal in the root of this folder run: 
   - `python3 run.py` (Mac/Linux)
   - `python run.py` (Windows)
@@ -79,11 +72,11 @@ This tool can be used by anybody, but is aimed for people who want to easily tra
 6. The `.sql` file in the `model` folder will contain a SQL written model  
 
 ## Testing already trained model on a new dataset
-1. Make sure new dataset is exactly the same format as the dataset the model was trained on
+1. Make sure new dataset has the same features as the dataset the model was trained on (same features)
 2. Save dataset in the `input/data/` folder (more on input data at [input data](#data))
 3. In the terminal in the root of this folder run: 
-  - `python3 test_model.py` (Mac/Linux)
-  - `python test_model.py` (Windows)
+  - `python3 check_model.py` (Mac/Linux)
+  - `python check_model.py` (Windows)
 4. Follow the instructions on screen
 5. The output will be saved in the folder `trained_models/<selected_model>/tested_datasets/<selected_dataset>/`
 
@@ -102,6 +95,7 @@ List with names of the columns which should be used as feature (optional)
 ### model_params
 Dictionary of parameters that can be used with model of choice (optional). Check the model's documentation:
 - EBM ([model documentation](https://interpret.ml/docs/ebm.html))
+- Linear/Logistic regression ([model documentation](https://interpret.ml/docs/lr.html))
 - Decision tree ([model documentation](https://interpret.ml/docs/dt.html))
 - Decision rule ([model documentation](https://interpret.ml/docs/dr.html))
 
@@ -150,13 +144,12 @@ Name of target column (required)
 
 ## TODO list
 - EBM
-  - SQL interaction terms first term with least values
-  - SQL interaction terms group by to merge similar score bounds
   - Make multi class classification EBM work fully
   - Make regression EBM work fully
 
 - Checks and config
   - Add check if variables and target are finite 
+  - Add check such that variables have (enough different values)
   - Add variables being NULL checked
   - Add random seed to config file
   - Implement null handling (there is an implementation mentioned [here](https://github.com/interpretml/interpret/issues/18))
@@ -170,8 +163,11 @@ Name of target column (required)
   - Add calibration (platt scaling/isotonic regression)
   - Add changelog and versioning
   - Extend logging granularity 
+  - Add package versions to logging
   - Add SQL translation for decision rule
-  - Make a proper testing procedure
-  - Add more example files (binary/regression/multiclass)
+  - Add testing for multiclass
+  - Add pass through columns
+  - Add create config option when needing to select config
+  - Add quick config maker (only specify target, should remove dates and ID columns)
 
 # Troubleshooting
\ No newline at end of file
diff --git a/test_model.py b/check_model.py
similarity index 90%
rename from test_model.py
rename to check_model.py
index c268538..d19085e 100644
--- a/test_model.py
+++ b/check_model.py
@@ -1,4 +1,4 @@
-import os 
+import os
 import re
 import sys
 
@@ -58,22 +58,24 @@
 # Create extra folder in trained model folder
 # Make directory with current data and model name
 try:
-    model_folder = model_path.split('trained_models/')[1].split('/')[0]
-    csv_name = csv_path.split('/')[-1]
+    model_folder = model_path.split("trained_models/")[1].split("/")[0]
+    csv_name = csv_path.split("/")[-1]
     destination_path = f"trained_models/{model_folder}/tested_datasets/{csv_name}"
 
     if not os.path.exists(destination_path.split(csv_name)[0]):
         os.makedirs(destination_path.split(csv_name)[0])
-        
+
     os.makedirs(destination_path)
     os.makedirs(f"{destination_path}/performance")
 
 except FileExistsError:
-    sys.exit("Error: tested_datasets directory already exists within trained_models/{model_folder}")
+    sys.exit(
+        "Error: tested_datasets directory already exists within trained_models/{model_folder}"
+    )
 
 # Trigger python script to do the actual work
 print("\nRunning command:")
-if sys.platform == 'win32':
+if sys.platform == "win32":
     command = f".ml2sql\Scripts\python.exe scripts/modeltester.py --model_path {model_path} --data_path {csv_path} --destination_path {destination_path}"
 else:
     command = f".ml2sql/bin/python scripts/modeltester.py --model_path {model_path} --data_path {csv_path} --destination_path {destination_path}"
@@ -84,5 +86,3 @@
 
 print("\nModel performance outputs can be found in folder:")
 print(f"{os.getcwd()}/trained_models/{model_folder}/tested_datasets/{csv_name}/")
-
-
diff --git a/input/configuration/example_binary_titanic.json b/input/configuration/example_binary_titanic.json
index 960f236..fef229c 100644
--- a/input/configuration/example_binary_titanic.json
+++ b/input/configuration/example_binary_titanic.json
@@ -3,12 +3,11 @@
     "Pclass",
     "Sex",
     "Age",
-    "Siblings/Spouses Aboard",
-    "Parents/Children Aboard",
+    "Siblings_Spouses_Aboard",
+    "Parents_Children_Aboard",
     "Fare"
   ],
   "model_params": {
-      "interactions": 5
   },
   "post_params": {
     "calibration": "false",
diff --git a/input/configuration/example_multiclass_faults.json b/input/configuration/example_multiclass_faults.json
index 1dd0b63..e979be3 100644
--- a/input/configuration/example_multiclass_faults.json
+++ b/input/configuration/example_multiclass_faults.json
@@ -29,7 +29,6 @@
     "SigmoidOfAreas"
   ],
   "model_params": {
-	"max_bins": 5
   },
   "post_params": {
     "calibration": "false",
diff --git a/input/configuration/example_multiclass_faults_slim.json b/input/configuration/example_multiclass_faults_slim.json
new file mode 100644
index 0000000..f58d8d0
--- /dev/null
+++ b/input/configuration/example_multiclass_faults_slim.json
@@ -0,0 +1,22 @@
+{
+  "features": [
+    "X_Minimum",
+    "X_Maximum",
+    "Y_Minimum",
+    "Y_Maximum"
+  ],
+  "model_params": {
+  },
+  "post_params": {
+    "calibration": "false",
+    "sql_split": "true",
+    "file_type": "png"
+  },
+  "pre_params": {
+    "cv_type": "notimeseriesplit",
+    "max_rows": 100000,
+    "time_sensitive_column": "date_column",
+    "upsampling": "false"
+  },
+  "target": "target"
+}
diff --git a/input/configuration/example_regression_used_cars.json b/input/configuration/example_regression_used_cars.json
new file mode 100644
index 0000000..d852cc3
--- /dev/null
+++ b/input/configuration/example_regression_used_cars.json
@@ -0,0 +1,24 @@
+{
+    "features": [
+        "seats",
+        "manufacturing_year",
+        "mileage",
+        "engine",
+        "max_power",
+        "torque"
+    ],
+    "model_params": {
+    },
+    "post_params": {
+        "calibration": "false",
+        "sql_split": "true",
+        "file_type": "png"
+    },
+    "pre_params": {
+        "cv_type": "kfold",
+        "max_rows": 99999,
+        "time_sensitive_column": "_",
+        "upsampling": "false"
+    },
+    "target": "price"
+}
\ No newline at end of file
diff --git a/input/data/example_binary_titanic.csv b/input/data/example_binary_titanic.csv
index 853188c..f84bed8 100644
--- a/input/data/example_binary_titanic.csv
+++ b/input/data/example_binary_titanic.csv
@@ -1,4 +1,4 @@
-Survived,Pclass,Name,Sex,Age,Siblings/Spouses Aboard,Parents/Children Aboard,Fare
+Survived,Pclass,Name,Sex,Age,Siblings_Spouses_Aboard,Parents_Children_Aboard,Fare
 0,3,Mr. Owen Harris Braund,male,22,1,0,7.25
 1,1,Mrs. John Bradley (Florence Briggs Thayer) Cumings,female,38,1,0,71.2833
 1,3,Miss. Laina Heikkinen,female,26,0,0,7.925
diff --git a/input/data/example_regression_used_cars.csv b/input/data/example_regression_used_cars.csv
new file mode 100644
index 0000000..1e3d396
--- /dev/null
+++ b/input/data/example_regression_used_cars.csv
@@ -0,0 +1,1543 @@
+,car_name,registration_year,insurance_validity,fuel_type,seats,kms_driven,ownsership,transmission,manufacturing_year,mileage,engine,max_power,torque,price
+0,2017 Mercedes-Benz S-Class S400,Jul-17,Comprehensive,Petrol,5,56000,First Owner,Automatic,2017,7.81,2996,2996,333,63.75
+1,2020 Nissan Magnite Turbo CVT XV Premium Opt BSVI,Jan-21,Comprehensive,Petrol,5,30615,First Owner,Automatic,2020,17.4,999,999,9863,8.99
+2,2018 BMW X1 sDrive 20d xLine,Sep-18,Comprehensive,Diesel,5,24000,First Owner,Automatic,2018,20.68,1995,1995,188,23.75
+3,2019 Kia Seltos GTX Plus,Dec-19,Comprehensive,Petrol,5,18378,First Owner,Manual,2019,16.5,1353,1353,13808,13.56
+4,2019 Skoda Superb LK 1.8 TSI AT,Aug-19,Comprehensive,Petrol,5,44900,First Owner,Automatic,2019,14.67,1798,1798,17746,24
+5,2017 Honda Jazz 1.2 S i VTEC,Jul-17,Third Party insurance,Petrol,5,42000,First Owner,Manual,2017,18.7,1199,1199,887,5.45
+6,2018 Hyundai Grand i10 1.2 Kappa Sportz BSIV,Feb-19,Comprehensive,Petrol,5,36739,First Owner,Manual,2018,18.9,1197,1197,8186,5.12
+7,2018 Hyundai Creta 1.6 SX,Jul-18,Comprehensive,Petrol,5,76000,First Owner,Manual,2018,15.8,1591,1591,1213,9.3
+8,2015 Mercedes-Benz S-Class S 350 CDI,Apr-15,Comprehensive,Diesel,5,68000,Second Owner,Automatic,2015,13.5,2987,2987,25479,42
+9,2019 Tata Nexon 1.2 Revotron XZ Plus,Mar-19,Comprehensive,Petrol,5,28783,First Owner,Manual,2019,17,1198,1198,1085,8.02
+10,2020 Honda City VX CVT,Mar-20,Comprehensive,Petrol,5,40000,First Owner,Automatic,2020,17.4,1497,1497,1176,10.95
+11,2021 Renault Duster RXS,Feb-22,Comprehensive,Petrol,5,17382,First Owner,Manual,2021,16.42,1498,1498,10455,8.99
+12,2014 BMW 3 Series 320d Prestige,2014,Third Party insurance,Diesel,5,120000,First Owner,Automatic,2014,18.88,1995,1995,184,7.45
+13,2021 Hyundai Venue SX Plus Turbo DCT,Jan-22,Comprehensive,Petrol,5,17000,First Owner,Automatic,2021,18.15,998,998,11835,10.95
+14,2019 Hyundai Grand i10 1.2 Kappa Sportz BSIV,Apr-19,Comprehensive,Petrol,5,26867,First Owner,Manual,2019,18.9,1197,1197,8186,5.78
+15,2022 Hyundai i20 Asta Opt,Aug-22,Third Party insurance,Petrol,5,30000,First Owner,Manual,2022,21,1197,1197,8180,8.95
+16,2014 BMW 3 Series 320d Luxury Line,2014,Third Party insurance,Diesel,5,150000,First Owner,Automatic,2014,18.88,1995,1995,184,8.5
+17,2018 BMW 3 Series 320d Luxury Line,Mar-18,Comprehensive,Diesel,5,53000,First Owner,Automatic,2018,22.69,1995,1995,190,23.5
+18,2019 Ford Ecosport 1.5 Petrol Titanium Plus BSIV,Nov-19,Comprehensive,Petrol,5,40000,First Owner,Manual,2019,17,1497,1497,12136,7.95
+19,2020 Jeep Compass 1.4 Limited Plus,Nov-20,Comprehensive,Petrol,5,48000,First Owner,Automatic,2020,14.1,1368,1368,16077,18.95
+20,2021 MG Gloster Savvy 6-Str,Sep-21,Comprehensive,Diesel,6,35000,First Owner,Automatic,2021,12.4,1996,1996,21501,35
+21,2010 Maruti Swift 1.2 VXi BSII,Oct-10,Comprehensive,Petrol,5,100525,First Owner,Manual,2010,16.1,1197,1197,85,2.09
+22,2015 Honda City i VTEC CVT VX,Sep-15,Third Party insurance,Petrol,5,83000,Second Owner,Automatic,2015,18,1497,1497,1173,6.25
+23,2011 Maruti Wagon R LXI BSIII,Aug-11,Comprehensive,Petrol,5,40191,Second Owner,Manual,2011,998,671,671,90,2.12
+24,2015 Audi A6 35 TDI,Dec-15,Comprehensive,Diesel,5,62152,First Owner,Automatic,2015,18.53,1968,1968,18774,20
+25,2017 Hyundai Creta 1.6 VTVT S,Aug-17,Third Party insurance,Petrol,5,49000,First Owner,Manual,2017,15.29,1591,1591,1213,8.35
+26,2017 Maruti Baleno 1.2 Delta,Aug-17,Comprehensive,Petrol,5,56215,First Owner,Manual,2017,21.4,1197,1197,831,5.03
+27,2018 Toyota Yaris J,Sep-18,Comprehensive,Petrol,5,53000,First Owner,Manual,2018,17.1,1496,1496,10594,6.95
+28,2015 Toyota Fortuner 4x2 AT,Sep-15,Comprehensive,Diesel,7,100000,First Owner,Automatic,2015,12.55,2982,2982,1685,16
+29,2020 Hyundai Creta SX Turbo BSVI,Aug-20,Comprehensive,Petrol,5,36346,First Owner,Automatic,2020,16.8,1353,1353,13808,15.22
+30,2018 Jaguar XE 2.0L Diesel Portfolio,Jul-18,Comprehensive,Diesel,5,48000,First Owner,Automatic,2018,13.5,1999,1999,177,26.95
+31,2019 Hyundai i20 Sportz Plus BSIV,Nov-19,Comprehensive,Petrol,5,42098,First Owner,Manual,2019,18.6,1197,1197,8186,6.7
+32,2018 Jeep Compass 2.0 Longitude Option BSIV,2018,Third Party insurance,Diesel,5,40000,First Owner,Manual,2018,17.1,1956,1956,170,10.75
+33,2019 BMW X1 sDrive 20d xLine,Oct-19,Comprehensive,Diesel,5,64000,First Owner,Automatic,2019,20.68,1995,1995,188,25.5
+34,2022 Maruti Swift ZXI Plus DT AMT BSVI,Dec-22,Comprehensive,Petrol,5,13158,First Owner,Automatic,2022,22.56,1197,1197,8850,8.38
+35,2018 Hyundai Creta 1.6 SX Automatic Diesel,Jun-18,Third Party insurance,Diesel,5,65400,First Owner,Automatic,2018,17.6,1582,1582,1262,10.9
+36,2017 Honda Amaze S i-VTEC,2017,Third Party insurance,Petrol,5,100000,First Owner,Manual,2017,17.8,1198,1198,867,3.95
+37,2022 Tata Tiago XZ Plus CNG BSVI,Aug-22,Comprehensive,CNG,5,30000,First Owner,Manual,2022,26.49,1199,1199,72,7.25
+38,2017 Honda Jazz 1.5 E i DTEC,Jun-17,Comprehensive,Diesel,5,62000,First Owner,Manual,2017,1498,986,986,200,4.75
+39,2010 Volkswagen Beetle 2.0,May-10,Comprehensive,Petrol,4,40000,First Owner,Automatic,2010,10.98,1984,1984,1144,11.95
+40,2021 MG Gloster Savvy 6-Str,Sep-21,Comprehensive,Diesel,6,35000,First Owner,Automatic,2021,12.4,1996,1996,21501,35
+41,2010 Maruti Swift 1.2 VXi BSII,Oct-10,Comprehensive,Petrol,5,100525,First Owner,Manual,2010,16.1,1197,1197,85,2.09
+42,2015 Honda City i VTEC CVT VX,Sep-15,Third Party insurance,Petrol,5,83000,Second Owner,Automatic,2015,18,1497,1497,1173,6.25
+43,2011 Maruti Wagon R LXI BSIII,Aug-11,Comprehensive,Petrol,5,40191,Second Owner,Manual,2011,998,671,671,90,2.12
+44,2015 Audi A6 35 TDI,Dec-15,Comprehensive,Diesel,5,62152,First Owner,Automatic,2015,18.53,1968,1968,18774,20
+45,2017 Hyundai Creta 1.6 VTVT S,Aug-17,Third Party insurance,Petrol,5,49000,First Owner,Manual,2017,15.29,1591,1591,1213,8.35
+46,2017 Maruti Baleno 1.2 Delta,Aug-17,Comprehensive,Petrol,5,56215,First Owner,Manual,2017,21.4,1197,1197,831,5.03
+47,2018 Toyota Yaris J,Sep-18,Comprehensive,Petrol,5,53000,First Owner,Manual,2018,17.1,1496,1496,10594,6.95
+48,2015 Toyota Fortuner 4x2 AT,Sep-15,Comprehensive,Diesel,7,100000,First Owner,Automatic,2015,12.55,2982,2982,1685,16
+49,2020 Hyundai Creta SX Turbo BSVI,Aug-20,Comprehensive,Petrol,5,36346,First Owner,Automatic,2020,16.8,1353,1353,13808,15.22
+50,2018 Jaguar XE 2.0L Diesel Portfolio,Jul-18,Comprehensive,Diesel,5,48000,First Owner,Automatic,2018,13.5,1999,1999,177,26.95
+51,2019 Hyundai i20 Sportz Plus BSIV,Nov-19,Comprehensive,Petrol,5,42098,First Owner,Manual,2019,18.6,1197,1197,8186,6.7
+52,2018 Jeep Compass 2.0 Longitude Option BSIV,2018,Third Party insurance,Diesel,5,40000,First Owner,Manual,2018,17.1,1956,1956,170,10.75
+53,2019 BMW X1 sDrive 20d xLine,Oct-19,Comprehensive,Diesel,5,64000,First Owner,Automatic,2019,20.68,1995,1995,188,25.5
+54,2022 Maruti Swift ZXI Plus DT AMT BSVI,Dec-22,Comprehensive,Petrol,5,13158,First Owner,Automatic,2022,22.56,1197,1197,8850,8.38
+55,2018 Hyundai Creta 1.6 SX Automatic Diesel,Jun-18,Third Party insurance,Diesel,5,65400,First Owner,Automatic,2018,17.6,1582,1582,1262,10.9
+56,2017 Honda Amaze S i-VTEC,2017,Third Party insurance,Petrol,5,100000,First Owner,Manual,2017,17.8,1198,1198,867,3.95
+57,2022 Tata Tiago XZ Plus CNG BSVI,Aug-22,Comprehensive,CNG,5,30000,First Owner,Manual,2022,26.49,1199,1199,72,7.25
+58,2017 Honda Jazz 1.5 E i DTEC,Jun-17,Comprehensive,Diesel,5,62000,First Owner,Manual,2017,1498,986,986,200,4.75
+59,2010 Volkswagen Beetle 2.0,May-10,Comprehensive,Petrol,4,40000,First Owner,Automatic,2010,10.98,1984,1984,1144,11.95
+60,2023 Honda City ZX CVT,Mar-23,Comprehensive,Petrol,5,10280,First Owner,Automatic,2023,18.4,1498,1498,11935,16
+61,2015 Maruti Baleno 1.2 Alpha,Nov-15,Comprehensive,Petrol,5,17282,First Owner,Manual,2015,21.4,1197,1197,831,5.45
+62,2019 Honda CR-V 2.0 CVT,Aug-19,Third Party insurance,Petrol,5,30500,First Owner,Automatic,2019,14.4,1997,1997,15189,22.95
+63,2020 Kia Seltos HTX Plus Diesel,Sep-20,Comprehensive,Diesel,5,60755,First Owner,Manual,2020,20.8,1493,1493,11343,13.51
+64,2021 Mercedes-Benz C-Class Progressive C 200,Jul-21,Comprehensive,Petrol,5,25000,Second Owner,Automatic,2021,11.9,1950,1950,20115,40.75
+65,2018 Mahindra Scorpio S11,Aug-18,Comprehensive,Diesel,7,47000,First Owner,Manual,2018,15.4,2179,2179,13678,14.5
+66,2020 Kia Seltos GTX DCT,Jun-20,Comprehensive,Petrol,5,59316,First Owner,Automatic,2020,16.2,1353,1353,138,13.99
+67,2021 Toyota Yaris J BSIV,Apr-21,Comprehensive,Petrol,5,48000,Third Owner,Manual,2021,17.1,1496,1496,1055,6.95
+68,2023 BMW 5 Series 530i M Sport BSVI,Nov-23,Zero Dep,Petrol,5,20000,First Owner,Automatic,2023,14.82,1998,1998,24808,65
+69,2020 Renault KWID Climber 1.0 AMT Opt,Dec-20,Third Party insurance,Petrol,5,12503,First Owner,Automatic,2020,22,999,999,67,5.15
+70,2021 Jeep Compass 1.4 Sport BSVI,Jun-21,Comprehensive,Petrol,5,10000,First Owner,Manual,2021,14.3,1368,1368,16077,15.95
+71,2011 Maruti Swift 1.2 VXi BSII,May-11,Comprehensive,Petrol,5,73717,Second Owner,Manual,2011,16.1,1197,1197,85,2.41
+72,2016 Mercedes-Benz GL-Class 350 CDI Blue Efficiency,2016,Third Party insurance,Diesel,7,90000,Second Owner,Automatic,2016,11.3,2987,2987,2548,32.5
+73,2017 Honda Jazz V CVT,Oct-17,Comprehensive,Petrol,5,17000,First Owner,Automatic,2017,17.1,1199,1199,8850,5.95
+74,2014 Hyundai Grand i10 AT Asta,Nov-14,Comprehensive,Petrol,5,36047,First Owner,Automatic,2014,18.9,1197,1197,82,4.32
+75,2018 Maruti Wagon R CNG LXI,Feb-18,Comprehensive,CNG,5,45000,First Owner,Manual,2018,998,5833,5833,78,4.45
+76,2009 Maruti Swift Dzire VDi,2009,Third Party insurance,Diesel,5,100000,First Owner,Manual,2009,19.3,1248,1248,739,2
+77,2016 Hyundai i10 Sportz,Jul-16,Comprehensive,Petrol,5,50000,Second Owner,Manual,2016,20.36,1197,1197,789,3.45
+78,2018 Maruti Swift VXI,Aug-18,Comprehensive,Petrol,5,51000,First Owner,Manual,2018,22,1197,1197,8180,5.5
+79,2018 Mahindra XUV500 W5,Jul-18,Third Party,Diesel,7,62000,Second Owner,Manual,2018,2179,15287,15287,360,8.5
+80,2023 Honda City ZX CVT,Mar-23,Comprehensive,Petrol,5,10280,First Owner,Automatic,2023,18.4,1498,1498,11935,16
+81,2015 Maruti Baleno 1.2 Alpha,Nov-15,Comprehensive,Petrol,5,17282,First Owner,Manual,2015,21.4,1197,1197,831,5.45
+82,2019 Honda CR-V 2.0 CVT,Aug-19,Third Party insurance,Petrol,5,30500,First Owner,Automatic,2019,14.4,1997,1997,15189,22.95
+83,2020 Kia Seltos HTX Plus Diesel,Sep-20,Comprehensive,Diesel,5,60755,First Owner,Manual,2020,20.8,1493,1493,11343,13.51
+84,2021 Mercedes-Benz C-Class Progressive C 200,Jul-21,Comprehensive,Petrol,5,25000,Second Owner,Automatic,2021,11.9,1950,1950,20115,40.75
+85,2018 Mahindra Scorpio S11,Aug-18,Comprehensive,Diesel,7,47000,First Owner,Manual,2018,15.4,2179,2179,13678,14.5
+86,2020 Kia Seltos GTX DCT,Jun-20,Comprehensive,Petrol,5,59316,First Owner,Automatic,2020,16.2,1353,1353,138,13.99
+87,2021 Toyota Yaris J BSIV,Apr-21,Comprehensive,Petrol,5,48000,Third Owner,Manual,2021,17.1,1496,1496,1055,6.95
+88,2023 BMW 5 Series 530i M Sport BSVI,Nov-23,Zero Dep,Petrol,5,20000,First Owner,Automatic,2023,14.82,1998,1998,24808,65
+89,2020 Renault KWID Climber 1.0 AMT Opt,Dec-20,Third Party insurance,Petrol,5,12503,First Owner,Automatic,2020,22,999,999,67,5.15
+90,2021 Jeep Compass 1.4 Sport BSVI,Jun-21,Comprehensive,Petrol,5,10000,First Owner,Manual,2021,14.3,1368,1368,16077,15.95
+91,2011 Maruti Swift 1.2 VXi BSII,May-11,Comprehensive,Petrol,5,73717,Second Owner,Manual,2011,16.1,1197,1197,85,2.41
+92,2016 Mercedes-Benz GL-Class 350 CDI Blue Efficiency,2016,Third Party insurance,Diesel,7,90000,Second Owner,Automatic,2016,11.3,2987,2987,2548,32.5
+93,2017 Honda Jazz V CVT,Oct-17,Comprehensive,Petrol,5,17000,First Owner,Automatic,2017,17.1,1199,1199,8850,5.95
+94,2014 Hyundai Grand i10 AT Asta,Nov-14,Comprehensive,Petrol,5,36047,First Owner,Automatic,2014,18.9,1197,1197,82,4.32
+95,2018 Maruti Wagon R CNG LXI,Feb-18,Comprehensive,CNG,5,45000,First Owner,Manual,2018,998,5833,5833,78,4.45
+96,2009 Maruti Swift Dzire VDi,2009,Third Party insurance,Diesel,5,100000,First Owner,Manual,2009,19.3,1248,1248,739,2
+97,2016 Hyundai i10 Sportz,Jul-16,Comprehensive,Petrol,5,50000,Second Owner,Manual,2016,20.36,1197,1197,789,3.45
+98,2018 Maruti Swift VXI,Aug-18,Comprehensive,Petrol,5,51000,First Owner,Manual,2018,22,1197,1197,8180,5.5
+99,2018 Mahindra XUV500 W5,Jul-18,Third Party,Diesel,7,62000,Second Owner,Manual,2018,2179,15287,15287,360,8.5
+100,2017 Toyota Camry 2.5 Hybrid,Jul-17,Third Party insurance,Petrol,5,45000,First Owner,Automatic,2017,19.16,2494,2494,1577,22.5
+101,2021 Hyundai i20 Asta Opt Turbo DCT BSVI,Aug-21,Comprehensive,Petrol,5,17041,First Owner,Automatic,2021,20.28,998,998,11841,10.49
+102,2018 Mahindra XUV500 W6 1.99 mHawk,Nov-18,Comprehensive,Diesel,7,49000,First Owner,Manual,2018,16,1997,1997,140,9.25
+103,2020 Hyundai Venue SX Turbo,Aug-20,Comprehensive,Petrol,5,23588,First Owner,Manual,2020,18.27,998,998,11835,9.2
+104,2018 Mercedes-Benz CLA Urban Sport 200d,Oct-18,Comprehensive,Diesel,5,50000,Second Owner,Automatic,2018,17.9,2143,2143,1341,22
+105,2017 Toyota Innova Crysta 2.8 GX AT BSIV,Mar-17,Third Party insurance,Diesel,7,76000,First Owner,Automatic,2017,11.36,2755,2755,1715,14.75
+106,2019 Maruti Baleno Delta,May-19,Comprehensive,Petrol,5,49341,First Owner,Manual,2019,21.01,1197,1197,8180,5.76
+107,2013 Honda Amaze VX i-Vtech,May-13,Comprehensive,Petrol,5,56000,First Owner,Manual,2013,18,1198,1198,867,3.25
+108,2023 MG Hector Plus 1.5 Turbo Sharp Pro CVT BSVI,May-23,Comprehensive,Petrol,6,12000,First Owner,Automatic,2023,12.34,1451,1451,141,21
+109,2014 Honda City i VTEC V,Jul-14,Comprehensive,Petrol,5,51734,First Owner,Manual,2014,17.8,1497,1497,1173,5.72
+110,2018 Maruti Swift VXI,Jun-18,Third Party insurance,Petrol,5,22000,First Owner,Manual,2018,22,1197,1197,8180,5.75
+111,2018 Hyundai Creta 1.6 SX Diesel,Aug-18,Comprehensive,Diesel,5,45084,First Owner,Manual,2018,20.5,1582,1582,1262,9.22
+112,2015 Mahindra Scorpio S10 AT 4WD,2015,Third Party insurance,Diesel,7,20000,First Owner,Automatic,2015,15.4,2179,2179,120,11
+113,2016 Honda Amaze S i-VTEC,Sep-16,Comprehensive,Petrol,5,29000,First Owner,Manual,2016,17.8,1198,1198,867,4.8
+114,2021 Hyundai Venue SX Turbo,Jan-22,Comprehensive,Petrol,5,16763,First Owner,Manual,2021,18.27,998,998,11835,9.69
+115,2022 Tata Altroz XM plus BSVI,May-22,Third Party insurance,Petrol,5,6000,First Owner,Manual,2022,19.33,1199,1199,8683,6.95
+116,2017 BMW 7 Series 730Ld M Sport,2017,Third Party insurance,Diesel,5,60000,2993 cc,2017,Power Steering,2993,26149,26149,620,55
+117,2015 Mahindra XUV500 W4,Aug-15,Comprehensive,Diesel,7,86000,First Owner,Manual,2015,15.1,2179,2179,140,5.45
+118,2018 Honda Jazz VX CVT,Jul-18,Comprehensive,Petrol,5,24000,First Owner,Automatic,2018,17.1,1199,1199,8850,6.55
+119,2021 Hyundai Venue S,Mar-21,Comprehensive,Petrol,5,9000,First Owner,Manual,2021,20.36,1197,1197,8180,7.75
+120,2017 Toyota Camry 2.5 Hybrid,Jul-17,Third Party insurance,Petrol,5,45000,First Owner,Automatic,2017,19.16,2494,2494,1577,22.5
+121,2021 Hyundai i20 Asta Opt Turbo DCT BSVI,Aug-21,Comprehensive,Petrol,5,17041,First Owner,Automatic,2021,20.28,998,998,11841,10.49
+122,2018 Mahindra XUV500 W6 1.99 mHawk,Nov-18,Comprehensive,Diesel,7,49000,First Owner,Manual,2018,16,1997,1997,140,9.25
+123,2020 Hyundai Venue SX Turbo,Aug-20,Comprehensive,Petrol,5,23588,First Owner,Manual,2020,18.27,998,998,11835,9.2
+124,2018 Mercedes-Benz CLA Urban Sport 200d,Oct-18,Comprehensive,Diesel,5,50000,Second Owner,Automatic,2018,17.9,2143,2143,1341,22
+125,2017 Toyota Innova Crysta 2.8 GX AT BSIV,Mar-17,Third Party insurance,Diesel,7,76000,First Owner,Automatic,2017,11.36,2755,2755,1715,14.75
+126,2019 Maruti Baleno Delta,May-19,Comprehensive,Petrol,5,49341,First Owner,Manual,2019,21.01,1197,1197,8180,5.76
+127,2013 Honda Amaze VX i-Vtech,May-13,Comprehensive,Petrol,5,56000,First Owner,Manual,2013,18,1198,1198,867,3.25
+128,2023 MG Hector Plus 1.5 Turbo Sharp Pro CVT BSVI,May-23,Comprehensive,Petrol,6,12000,First Owner,Automatic,2023,12.34,1451,1451,141,21
+129,2014 Honda City i VTEC V,Jul-14,Comprehensive,Petrol,5,51734,First Owner,Manual,2014,17.8,1497,1497,1173,5.72
+130,2018 Maruti Swift VXI,Jun-18,Third Party insurance,Petrol,5,22000,First Owner,Manual,2018,22,1197,1197,8180,5.75
+131,2018 Hyundai Creta 1.6 SX Diesel,Aug-18,Comprehensive,Diesel,5,45084,First Owner,Manual,2018,20.5,1582,1582,1262,9.22
+132,2015 Mahindra Scorpio S10 AT 4WD,2015,Third Party insurance,Diesel,7,20000,First Owner,Automatic,2015,15.4,2179,2179,120,11
+133,2016 Honda Amaze S i-VTEC,Sep-16,Comprehensive,Petrol,5,29000,First Owner,Manual,2016,17.8,1198,1198,867,4.8
+134,2021 Hyundai Venue SX Turbo,Jan-22,Comprehensive,Petrol,5,16763,First Owner,Manual,2021,18.27,998,998,11835,9.69
+135,2022 Tata Altroz XM plus BSVI,May-22,Third Party insurance,Petrol,5,6000,First Owner,Manual,2022,19.33,1199,1199,8683,6.95
+136,2017 BMW 7 Series 730Ld M Sport,2017,Third Party insurance,Diesel,5,60000,2993 cc,2017,Power Steering,2993,26149,26149,620,55
+137,2015 Mahindra XUV500 W4,Aug-15,Comprehensive,Diesel,7,86000,First Owner,Manual,2015,15.1,2179,2179,140,5.45
+138,2018 Honda Jazz VX CVT,Jul-18,Comprehensive,Petrol,5,24000,First Owner,Automatic,2018,17.1,1199,1199,8850,6.55
+139,2021 Hyundai Venue S,Mar-21,Comprehensive,Petrol,5,9000,First Owner,Manual,2021,20.36,1197,1197,8180,7.75
+140,2022 Kia Carens Prestige Plus Turbo DCT 2022-2023,Mar-22,Comprehensive,Petrol,7,14900,First Owner,Automatic,2022,16.5,1353,1353,13805,16.5
+141,2022 Hyundai i20 N-Line N8 DCT BSVI,Feb-22,Comprehensive,Petrol,5,17172,Second Owner,Automatic,2022,20.25,998,998,11841,10.33
+142,2020 Mercedes-Benz GLE 300d BSVI,Oct-20,Zero Dep,Diesel,5,33000,First Owner,Automatic,2020,1950,24138,24138,500,78
+143,2016 Renault KWID RXT,Apr-16,Third Party insurance,Petrol,5,38000,Second Owner,Manual,2016,25.17,799,799,533,1.85
+144,2022 Tata Altroz XZ Plus BSVI,Sep-23,Comprehensive,Petrol,5,11501,First Owner,Manual,2022,19.33,1199,1199,8683,8.24
+145,2022 Mercedes-Benz GLE 300d BSVI,May-22,Zero Dep,Diesel,5,43703,First Owner,Automatic,2022,1950,24138,24138,500,82.9
+146,2021 Toyota Fortuner Legender 4x2 AT,Dec-21,Comprehensive,Diesel,7,29800,First Owner,Automatic,2021,2755,20115,20115,500,44
+147,2020 Maruti Baleno Zeta,Oct-20,Comprehensive,Petrol,5,22051,First Owner,Manual,2020,21.01,1197,1197,8180,6.98
+148,2021 Maruti Baleno Sigma,Nov-21,Comprehensive,Petrol,5,32965,First Owner,Manual,2021,1197,8180,8180,113,5.75
+149,2014 Hyundai i10 Magna 1.1L,Dec-14,Comprehensive,Petrol,5,96593,First Owner,Manual,2014,1086,6805,6805,9904,2.73
+150,2017 Hyundai Verna 1.6 VTVT SX Option,2017,Third Party insurance,Petrol,5,50000,First Owner,Manual,2017,17.01,1591,1591,1213,6.75
+151,2022 BMW 2 Series 220i M Sport Pro BSVI,Mar-22,Comprehensive,Petrol,5,15000,First Owner,Automatic,2022,14.82,1998,1998,18908,42
+152,2020 Tata Tiago XZ Plus Dual Tone Roof BSVI,Dec-20,Comprehensive,Petrol,5,27138,First Owner,Manual,2020,19.01,1199,1199,8482,5.92
+153,2022 Maruti Baleno 1.2 Delta,Jul-22,Comprehensive,Petrol,5,15000,First Owner,Manual,2022,21.4,1197,1197,831,7.25
+154,2018 Mercedes-Benz CLS-Class 250 CDI,2018,Third Party insurance,Diesel,4,10000,First Owner,Automatic,2018,19.4,2143,2143,204,38
+155,2023 Mahindra Scorpio N Z8L AT BSVI,Jun-23,Comprehensive,Petrol,7,9000,First Owner,Automatic,2023,1997,200,200,380,23.45
+156,2021 Kia Sonet HTX Plus Turbo iMT BSVI,Nov-21,Comprehensive,Petrol,5,10000,First Owner,Manual,2021,18.2,998,998,11836,10.2
+157,2020 Kia Seltos GTX Plus Diesel AT,Nov-20,Comprehensive,Diesel,5,70000,First Owner,Automatic,2020,18,1493,1493,11343,14.95
+158,2020 Mercedes-Benz C-Class Progressive C 220d,Jun-20,Comprehensive,Diesel,5,30000,First Owner,Automatic,2020,12.6,1950,1950,194,37.5
+159,2021 Hyundai i20 N-Line N8 DCT BSVI,Feb-22,Comprehensive,Petrol,5,16684,First Owner,Automatic,2021,20.25,998,998,11841,11.11
+160,2019 Mercedes-Benz AMG C43 4MATIC Coupe,Jul-19,Comprehensive,Petrol,5,30000,First Owner,Automatic,2019,2996,38487,38487,520,67
+161,2012 Maruti Swift LXI BSIV,Dec-12,Comprehensive,Petrol,5,92543,First Owner,Manual,2012,1197,8180,8180,113,2.74
+162,2021 Mahindra XUV700 AX7 AT Luxury Pack BSVI,Nov-21,Comprehensive,Petrol,7,25000,First Owner,Automatic,2021,1999,19713,19713,380,24.75
+163,2016 Ford Ecosport 1.5 Diesel Titanium Plus,Dec-16,Comprehensive,Diesel,5,59870,First Owner,Manual,2016,21.7,1498,1498,9896,4.95
+164,2016 Hyundai i20 Sportz 1.2,Jun-16,Comprehensive,Petrol,5,62700,First Owner,Manual,2016,18.6,1197,1197,8183,5.22
+165,2019 Kia Seltos HTX Plus AT D,Sep-19,Third Party insurance,Diesel,5,42132,First Owner,Automatic,2019,17.8,1493,1493,1134,14.75
+166,2018 Mercedes-Benz CLA 200 CGI Sport,Jul-18,Third Party insurance,Petrol,5,32000,First Owner,Automatic,2018,15.04,1991,1991,183,25.75
+167,2010 Maruti A-Star Zxi,Jun-10,Comprehensive,Petrol,5,58873,First Owner,Manual,2010,19,998,998,661,1.82
+168,2018 Renault Duster Petrol RXS CVT,Nov-18,Comprehensive,Petrol,5,10000,First Owner,Automatic,2018,14.99,1498,1498,1045,7.95
+169,2022 Tata Altroz XZ Plus BSVI,Sep-23,Comprehensive,Petrol,5,14069,First Owner,Manual,2022,19.33,1199,1199,8683,8.24
+170,2014 Nissan Terrano XV 110 PS Limited Edition,2014,Third Party insurance,Diesel,5,100000,1461 cc,2014,Power Steering,1461,1085,1085,248,6
+171,2014 Renault Duster RXL AWD,Oct-14,Third Party insurance,Diesel,5,80000,First Owner,Manual,2014,19.01,1461,1461,10845,2.85
+172,2016 Honda City i VTEC V,Mar-16,Comprehensive,Petrol,5,57453,First Owner,Manual,2016,17.8,1497,1497,1173,6.24
+173,2011 Ford Figo Petrol EXI,Jun-11,Comprehensive,Petrol,5,66717,Second Owner,Manual,2011,1196,70,70,102,70000
+174,2016 Mercedes-Benz GLS 350d 4MATIC,2016,Third Party insurance,Diesel,7,40000,Second Owner,Automatic,2016,11,2987,2987,258,43.33
+175,2022 Volvo XC40 T4 R-Design,Jan-22,Zero Dep,Petrol,5,16433,First Owner,Automatic,2022,1969,18740,18740,300,43.75
+176,2018 BMW X1 sDrive20i xLine,Dec-18,Third Party insurance,Petrol,5,17860,First Owner,Automatic,2018,15.71,1998,1998,189,29.9
+177,2020 Toyota Innova Crysta 2.8 ZX AT BSIV,Feb-20,Comprehensive,Diesel,7,52000,First Owner,Automatic,2020,11.36,2755,2755,1715,22.5
+178,2020 Mercedes-Benz C-Class Progressive C 220d,Jun-20,Comprehensive,Diesel,5,30000,First Owner,Automatic,2020,12.6,1950,1950,194,37.5
+179,2021 Hyundai i20 N-Line N8 DCT BSVI,Feb-22,Comprehensive,Petrol,5,16684,First Owner,Automatic,2021,20.25,998,998,11841,11.11
+180,2019 Mercedes-Benz AMG C43 4MATIC Coupe,Jul-19,Comprehensive,Petrol,5,30000,First Owner,Automatic,2019,2996,38487,38487,520,67
+181,2012 Maruti Swift LXI BSIV,Dec-12,Comprehensive,Petrol,5,92543,First Owner,Manual,2012,1197,8180,8180,113,2.74
+182,2021 Mahindra XUV700 AX7 AT Luxury Pack BSVI,Nov-21,Comprehensive,Petrol,7,25000,First Owner,Automatic,2021,1999,19713,19713,380,24.75
+183,2016 Ford Ecosport 1.5 Diesel Titanium Plus,Dec-16,Comprehensive,Diesel,5,59870,First Owner,Manual,2016,21.7,1498,1498,9896,4.95
+184,2016 Hyundai i20 Sportz 1.2,Jun-16,Comprehensive,Petrol,5,62700,First Owner,Manual,2016,18.6,1197,1197,8183,5.22
+185,2019 Kia Seltos HTX Plus AT D,Sep-19,Third Party insurance,Diesel,5,42132,First Owner,Automatic,2019,17.8,1493,1493,1134,14.75
+186,2018 Mercedes-Benz CLA 200 CGI Sport,Jul-18,Third Party insurance,Petrol,5,32000,First Owner,Automatic,2018,15.04,1991,1991,183,25.75
+187,2010 Maruti A-Star Zxi,Jun-10,Comprehensive,Petrol,5,58873,First Owner,Manual,2010,19,998,998,661,1.82
+188,2018 Renault Duster Petrol RXS CVT,Nov-18,Comprehensive,Petrol,5,10000,First Owner,Automatic,2018,14.99,1498,1498,1045,7.95
+189,2022 Tata Altroz XZ Plus BSVI,Sep-23,Comprehensive,Petrol,5,14069,First Owner,Manual,2022,19.33,1199,1199,8683,8.24
+190,2014 Nissan Terrano XV 110 PS Limited Edition,2014,Third Party insurance,Diesel,5,100000,1461 cc,2014,Power Steering,1461,1085,1085,248,6
+191,2014 Renault Duster RXL AWD,Oct-14,Third Party insurance,Diesel,5,80000,First Owner,Manual,2014,19.01,1461,1461,10845,2.85
+192,2016 Honda City i VTEC V,Mar-16,Comprehensive,Petrol,5,57453,First Owner,Manual,2016,17.8,1497,1497,1173,6.24
+193,2011 Ford Figo Petrol EXI,Jun-11,Comprehensive,Petrol,5,66717,Second Owner,Manual,2011,1196,70,70,102,70000
+194,2016 Mercedes-Benz GLS 350d 4MATIC,2016,Third Party insurance,Diesel,7,40000,Second Owner,Automatic,2016,11,2987,2987,258,43.33
+195,2022 Volvo XC40 T4 R-Design,Jan-22,Zero Dep,Petrol,5,16433,First Owner,Automatic,2022,1969,18740,18740,300,43.75
+196,2018 BMW X1 sDrive20i xLine,Dec-18,Third Party insurance,Petrol,5,17860,First Owner,Automatic,2018,15.71,1998,1998,189,29.9
+197,2020 Toyota Innova Crysta 2.8 ZX AT BSIV,Feb-20,Comprehensive,Diesel,7,52000,First Owner,Automatic,2020,11.36,2755,2755,1715,22.5
+198,2019 Mercedes-Benz S-Class S 350 d,Apr-20,Comprehensive,Diesel,5,27200,First Owner,Automatic,2019,13.5,2925,2925,28161,77
+199,2014 Hyundai Grand i10 Asta Option,Dec-14,Comprehensive,Petrol,5,25260,First Owner,Manual,2014,18.9,1197,1197,82,4.37
+200,2019 BMW 5 Series 520d Luxury Line,Mar-20,Zero Dep,Diesel,5,21421,Second Owner,Automatic,2019,20.37,1995,1995,18774,45.9
+201,2015 Hyundai i10 Sportz,Apr-15,Comprehensive,Petrol,5,70215,First Owner,Manual,2015,20.36,1197,1197,789,3.08
+202,2022 Hyundai Alcazar Platinum (O) Diesel AT,Feb-22,Comprehensive,Diesel,6,32900,First Owner,Automatic,2022,23.8,1493,1493,11398,20
+203,2021 Mercedes-Benz C-Class Progressive C 200,Aug-21,Third Party insurance,Petrol,5,40045,First Owner,Automatic,2021,11.9,1950,1950,20115,43.9
+204,2010 Maruti A-Star Vxi,Jan-11,Comprehensive,Petrol,5,75000,First Owner,Manual,2010,19,998,998,661,1.68
+205,2019 Mercedes-Benz C-Class Progressive C 200,Aug-21,Third Party insurance,Petrol,5,32325,First Owner,Automatic,2019,11.9,1950,1950,20115,44.9
+206,2021 MG Gloster Savvy 6-Str,Nov-21,Third Party insurance,Diesel,6,68000,First Owner,Automatic,2021,12.4,1996,1996,21501,33
+207,2015 Hyundai Grand i10 Nios AMT Asta,Oct-15,Comprehensive,Petrol,5,78501,First Owner,Automatic,2015,20.7,1197,1197,8186,3.94
+208,2018 Land Rover Discovery Sport Petrol SE 7S,Jan-19,Zero Dep,Petrol,7,46853,First Owner,Automatic,2018,12.83,1997,1997,23736,45.9
+209,2021 Maruti Baleno Zeta,Jun-21,Comprehensive,Petrol,5,27114,First Owner,Manual,2021,21.01,1197,1197,8180,7.18
+210,2023 Hyundai i20 N-Line N8 DCT BSVI,2023,Third Party insurance,Petrol,5,10000,998 cc,2023,Power Steering,998,11841,11841,172,11.7
+211,2017 Hyundai Creta 1.6 VTVT AT SX Plus,Mar-17,Third Party insurance,Petrol,5,88000,First Owner,Automatic,2017,13,1591,1591,1213,8.65
+212,2013 Maruti Swift Dzire VXI,Jul-13,Comprehensive,Petrol,5,58382,First Owner,Manual,2013,19.1,1197,1197,858,3.54
+213,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,30000,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+214,2015 Skoda Rapid 1.6 MPI Ambition Plus,2015,Third Party insurance,Petrol,5,80000,Second Owner,Manual,2015,15,1598,1598,1036,3.3
+215,2020 Mercedes-Benz C-Class Progressive C 200,Aug-20,Zero Dep,Petrol,5,32628,First Owner,Automatic,2020,11.9,1950,1950,20115,41.9
+216,2021 MG Gloster Savvy 6-Str,May-21,Comprehensive,Diesel,6,35000,First Owner,Automatic,2021,12.4,1996,1996,21501,36
+217,2014 Hyundai Grand i10 Magna,Dec-14,Comprehensive,Petrol,5,67264,Second Owner,Manual,2014,1197,82,82,114,3.27
+218,2019 Mercedes-Benz V-Class 2019-2022 Exclusive,Mar-19,Zero Dep,Diesel,6,17000,First Owner,Automatic,2019,16,1950,1950,16092,65
+219,2013 Maruti Wagon R LXI CNG,Aug-13,Comprehensive,CNG,5,77584,Second Owner,Manual,2013,26.6,998,998,5816,2.8
+220,2016 Mercedes-Benz S-Class Maybach S500,Sep-16,Comprehensive,Petrol,4,50000,First Owner,Automatic,2016,7.81,4663,4663,459,98.5
+221,2017 Mahindra Scorpio S6 Plus 7 Seater,2017,Third Party insurance,Diesel,7,70000,First Owner,Manual,2017,15.4,2179,2179,120,9
+222,2013 Maruti Swift LXI BSIV,Oct-13,Comprehensive,Petrol,5,71977,Second Owner,Manual,2013,1197,8180,8180,113,2.94
+223,2017 Maruti Ignis 1.2 Zeta BSIV,Nov-17,Comprehensive,Petrol,5,52690,Second Owner,Manual,2017,20.89,1197,1197,8180,4.2
+224,2022 Hyundai Creta SX Opt IVT,Aug-22,Comprehensive,Petrol,5,11900,First Owner,Automatic,2022,14,1497,1497,11318,18.25
+225,2017 Hyundai i20 Sportz 1.2,May-17,Comprehensive,Petrol,5,53747,First Owner,Manual,2017,18.6,1197,1197,8183,5.77
+226,2019 BMW X3 xDrive 20d Luxury Line,Jan-20,Zero Dep,Diesel,5,32321,First Owner,Automatic,2019,16.55,1995,1995,1877,49.9
+227,2015 Honda Brio S MT,May-15,Comprehensive,Petrol,5,55485,First Owner,Manual,2015,19.4,1198,1198,868,3.35
+228,2020 MG Hector Plus Smart DCT,2020,Third Party insurance,Petrol,6,20000,1451 cc,2020,Power Windows Front,1451,141,141,250,17.5
+229,2018 Land Rover Range Rover Velar P250 R-Dynamic SE,Nov-18,Third Party insurance,Petrol,5,54000,Second Owner,Automatic,2018,15.8,1997,1997,247,59.75
+230,2017 Maruti Baleno 1.2 Zeta,Sep-17,Comprehensive,Petrol,5,49404,First Owner,Manual,2017,21.4,1197,1197,831,5.44
+231,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+232,2018 Ford Endeavour 3.2 Titanium AT 4X4,2018,Third Party insurance,Diesel,7,100000,First Owner,Automatic,2018,10.91,3198,3198,197,22.5
+233,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+234,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+235,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+236,2021 MG Gloster Savvy 6-Str,May-21,Comprehensive,Diesel,6,35000,First Owner,Automatic,2021,12.4,1996,1996,21501,36
+237,2014 Hyundai Grand i10 Magna,Dec-14,Comprehensive,Petrol,5,67264,Second Owner,Manual,2014,1197,82,82,114,3.27
+238,2019 Mercedes-Benz V-Class 2019-2022 Exclusive,Mar-19,Zero Dep,Diesel,6,17000,First Owner,Automatic,2019,16,1950,1950,16092,65
+239,2013 Maruti Wagon R LXI CNG,Aug-13,Comprehensive,CNG,5,77584,Second Owner,Manual,2013,26.6,998,998,5816,2.8
+240,2016 Mercedes-Benz S-Class Maybach S500,Sep-16,Comprehensive,Petrol,4,50000,First Owner,Automatic,2016,7.81,4663,4663,459,98.5
+241,2017 Mahindra Scorpio S6 Plus 7 Seater,2017,Third Party insurance,Diesel,7,70000,First Owner,Manual,2017,15.4,2179,2179,120,9
+242,2013 Maruti Swift LXI BSIV,Oct-13,Comprehensive,Petrol,5,71977,Second Owner,Manual,2013,1197,8180,8180,113,2.94
+243,2017 Maruti Ignis 1.2 Zeta BSIV,Nov-17,Comprehensive,Petrol,5,52690,Second Owner,Manual,2017,20.89,1197,1197,8180,4.2
+244,2022 Hyundai Creta SX Opt IVT,Aug-22,Comprehensive,Petrol,5,11900,First Owner,Automatic,2022,14,1497,1497,11318,18.25
+245,2017 Hyundai i20 Sportz 1.2,May-17,Comprehensive,Petrol,5,53747,First Owner,Manual,2017,18.6,1197,1197,8183,5.77
+246,2019 BMW X3 xDrive 20d Luxury Line,Jan-20,Zero Dep,Diesel,5,32321,First Owner,Automatic,2019,16.55,1995,1995,1877,49.9
+247,2015 Honda Brio S MT,May-15,Comprehensive,Petrol,5,55485,First Owner,Manual,2015,19.4,1198,1198,868,3.35
+248,2020 MG Hector Plus Smart DCT,2020,Third Party insurance,Petrol,6,20000,1451 cc,2020,Power Windows Front,1451,141,141,250,17.5
+249,2018 Land Rover Range Rover Velar P250 R-Dynamic SE,Nov-18,Third Party insurance,Petrol,5,54000,Second Owner,Automatic,2018,15.8,1997,1997,247,59.75
+250,2017 Maruti Baleno 1.2 Zeta,Sep-17,Comprehensive,Petrol,5,49404,First Owner,Manual,2017,21.4,1197,1197,831,5.44
+251,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+252,2018 Ford Endeavour 3.2 Titanium AT 4X4,2018,Third Party insurance,Diesel,7,100000,First Owner,Automatic,2018,10.91,3198,3198,197,22.5
+253,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+254,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+255,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+256,2022 Mahindra Scorpio N Z8L AT BSVI,Apr-22,Comprehensive,Petrol,7,8000,First Owner,Automatic,2022,1997,200,200,380,24
+257,2014 Maruti Wagon R VXi BSII,Oct-14,Comprehensive,Petrol,5,33841,First Owner,Manual,2014,998,671,671,90,3.17
+258,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+259,2023 Volkswagen Virtus Topline BSVI,May-23,Comprehensive,Petrol,5,9246,First Owner,Manual,2023,19.4,999,999,11398,15.62
+260,2018 Toyota Innova Crysta 2.7 ZX AT BSIV,Feb-18,Comprehensive,Petrol,7,42000,First Owner,Automatic,2018,10.75,2694,2694,1637,17.9
+261,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+262,2018 Tata Tiago 1.05 Revotorq XT,Aug-18,Comprehensive,Diesel,5,42462,First Owner,Manual,2018,27.28,1047,1047,69,4.3
+263,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+264,2021 Mahindra Alturas G4 4X4 AT,Jan-21,Third Party insurance,Diesel,7,30000,First Owner,Automatic,2021,12.05,2157,2157,17849,24.75
+265,2012 Hyundai i20 Magna,Nov-12,Comprehensive,Petrol,5,96660,First Owner,Manual,2012,18.5,1197,1197,8285,2.47
+266,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+267,2014 Hyundai Grand i10 Asta,Sep-14,Comprehensive,Petrol,5,38963,First Owner,Manual,2014,18.9,1197,1197,82,4.13
+268,2011 Hyundai i20 1.2 Magna,2011,Third Party insurance,Petrol,5,70000,Second Owner,Manual,2011,18.5,1197,1197,805200,1.6
+269,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+270,2017 Hyundai Grand i10 1.2 Kappa Sportz BSIV,Nov-17,Comprehensive,Petrol,5,63249,First Owner,Manual,2017,18.9,1197,1197,8186,4.59
+271,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+272,2021 BMW 2 Series Black Shadow Edition,2021,Third Party insurance,Petrol,4,40000,1998 cc,2021,Power Steering,1998,18740,18740,280,32
+273,2016 Maruti Ertiga ZXI Plus,Aug-16,Comprehensive,Petrol,7,82000,First Owner,Manual,2016,19.01,1462,1462,10326,7.49
+274,2019 Maruti Ciaz 1.4 Sigma,Nov-19,Comprehensive,Petrol,5,38000,First Owner,Manual,2019,20.73,1373,1373,911,6.75
+275,2020 Kia Carnival Prestige,Nov-20,Third Party insurance,Diesel,7,40500,First Owner,Automatic,2020,14.11,2199,2199,19726,25.25
+276,2020 Kia Sonet GTX Plus Diesel BSVI,Oct-20,Zero Dep,Diesel,5,40000,First Owner,Manual,2020,1493,9863,9863,240,11.55
+277,2015 Hyundai i10 Sportz,Aug-15,Comprehensive,Petrol,5,65170,Second Owner,Manual,2015,20.36,1197,1197,789,3.02
+278,2018 Honda WR-V i-VTEC VX,Feb-18,Comprehensive,Petrol,5,50000,First Owner,Manual,2018,17.5,1199,1199,887,7.25
+279,2020 Renault KWID 1.0 RXL BSVI,Nov-20,Comprehensive,Petrol,5,34838,First Owner,Manual,2020,999,6706,6706,91,3.88
+280,2021 Hyundai i20 Asta Opt Turbo DCT BSVI,Jun-21,Comprehensive,Petrol,5,30466,First Owner,Automatic,2021,20.28,998,998,11841,10.5
+281,2020 Mercedes-Benz E-Class Exclusive E 220d,Nov-20,Comprehensive,Diesel,5,32000,Second Owner,Automatic,2020,16.1,1950,1950,1917,44.5
+282,2018 Volvo S90 D4 Momentum BSIV,Jul-18,Third Party insurance,Diesel,5,50000,First Owner,Automatic,2018,18,1969,1969,190,33
+283,2014 Maruti Swift Dzire VXI,Oct-14,Comprehensive,Petrol,5,48946,First Owner,Manual,2014,19.1,1197,1197,858,4.11
+284,2017 BMW X3 xDrive20d xLine,Mar-17,Comprehensive,Diesel,5,43498,Second Owner,Automatic,2017,18.56,1995,1995,190,29.9
+285,2022 Mahindra Thar LX 4-Str Convert Top AT BSVI,Feb-22,Comprehensive,Petrol,4,8744,First Owner,Automatic,2022,15.2,1997,1997,150,16.01
+286,2020 Hyundai Venue E Diesel,2020,Third Party insurance,Diesel,5,30000,First Owner,Manual,2020,1493,986,986,24026,7.8
+287,2017 Land Rover Discovery Sport Petrol HSE 7S,Nov-17,Comprehensive,Petrol,7,72000,First Owner,Automatic,2017,12.81,1997,1997,23736,32.5
+288,2017 Hyundai i20 Sportz 1.2,May-17,Comprehensive,Petrol,5,71361,First Owner,Manual,2017,18.6,1197,1197,8183,5.52
+289,2017 BMW X1 sDrive 20d xLine,Jul-17,Comprehensive,Diesel,5,60500,First Owner,Automatic,2017,20.68,1995,1995,188,19.95
+290,2021 Audi A6 45 TFSI Technology WO Matrix BSVI,2021,Third Party insurance,Petrol,5,30000,First Owner,Automatic,2021,14.11,1984,1984,2413,49.5
+291,2018 Ford Ecosport 1.5 Diesel Titanium,Oct-18,Comprehensive,Diesel,5,64000,First Owner,Manual,2018,21.7,1498,1498,9896,7.99
+292,2013 Mercedes-Benz B Class B180 Sports,Nov-13,Comprehensive,Petrol,5,26000,Second Owner,Automatic,2013,11.9,1595,1595,1207,12.45
+293,2016 Ford Ecosport 1.5 Petrol Titanium AT,Nov-16,Comprehensive,Petrol,5,60000,First Owner,Automatic,2016,14.7,1496,1496,12069,6.49
+294,2020 Kia Sonet GTX Plus Diesel BSVI,Oct-20,Zero Dep,Diesel,5,40000,First Owner,Manual,2020,1493,9863,9863,240,11.55
+295,2015 Hyundai i10 Sportz,Aug-15,Comprehensive,Petrol,5,65170,Second Owner,Manual,2015,20.36,1197,1197,789,3.02
+296,2018 Honda WR-V i-VTEC VX,Feb-18,Comprehensive,Petrol,5,50000,First Owner,Manual,2018,17.5,1199,1199,887,7.25
+297,2020 Renault KWID 1.0 RXL BSVI,Nov-20,Comprehensive,Petrol,5,34838,First Owner,Manual,2020,999,6706,6706,91,3.88
+298,2018 Land Rover Discovery Sport Petrol HSE 7S,Oct-18,Comprehensive,Petrol,7,72000,Second Owner,Automatic,2018,12.81,1997,1997,23736,49.5
+299,2021 Hyundai i20 Asta Opt Turbo DCT BSVI,Jun-21,Comprehensive,Petrol,5,30466,First Owner,Automatic,2021,20.28,998,998,11841,10.5
+300,2020 Mercedes-Benz E-Class Exclusive E 220d,Nov-20,Comprehensive,Diesel,5,32000,Second Owner,Automatic,2020,16.1,1950,1950,1917,44.5
+301,2018 Volvo S90 D4 Momentum BSIV,Jul-18,Third Party insurance,Diesel,5,50000,First Owner,Automatic,2018,18,1969,1969,190,33
+302,2014 Maruti Swift Dzire VXI,Oct-14,Comprehensive,Petrol,5,48946,First Owner,Manual,2014,19.1,1197,1197,858,4.11
+303,2017 BMW X3 xDrive20d xLine,Mar-17,Comprehensive,Diesel,5,43498,Second Owner,Automatic,2017,18.56,1995,1995,190,29.9
+304,2022 Mahindra Thar LX 4-Str Convert Top AT BSVI,Feb-22,Comprehensive,Petrol,4,8744,First Owner,Automatic,2022,15.2,1997,1997,150,16.01
+305,2020 Hyundai Venue E Diesel,2020,Third Party insurance,Diesel,5,30000,First Owner,Manual,2020,1493,986,986,24026,7.8
+306,2017 Land Rover Discovery Sport Petrol HSE 7S,Nov-17,Comprehensive,Petrol,7,72000,First Owner,Automatic,2017,12.81,1997,1997,23736,32.5
+307,2017 Hyundai i20 Sportz 1.2,May-17,Comprehensive,Petrol,5,71361,First Owner,Manual,2017,18.6,1197,1197,8183,5.52
+308,2017 BMW X1 sDrive 20d xLine,Jul-17,Comprehensive,Diesel,5,60500,First Owner,Automatic,2017,20.68,1995,1995,188,19.95
+309,2021 Audi A6 45 TFSI Technology WO Matrix BSVI,2021,Third Party insurance,Petrol,5,30000,First Owner,Automatic,2021,14.11,1984,1984,2413,49.5
+310,2018 Ford Ecosport 1.5 Diesel Titanium,Oct-18,Comprehensive,Diesel,5,64000,First Owner,Manual,2018,21.7,1498,1498,9896,7.99
+311,2013 Mercedes-Benz B Class B180 Sports,Nov-13,Comprehensive,Petrol,5,26000,Second Owner,Automatic,2013,11.9,1595,1595,1207,12.45
+312,2016 Ford Ecosport 1.5 Petrol Titanium AT,Nov-16,Comprehensive,Petrol,5,60000,First Owner,Automatic,2016,14.7,1496,1496,12069,6.49
+313,2021 Audi Q2 Premium Plus I,Jan-21,Comprehensive,Petrol,5,28000,First Owner,Automatic,2021,1984,18774,18774,320,26.5
+314,2011 Maruti Swift Dzire 1.2 Vxi BSIV,Mar-11,Comprehensive,Petrol,5,89002,First Owner,Manual,2011,17.5,1197,1197,858,2.37
+315,2018 Maruti Baleno 1.2 Alpha,Sep-18,Comprehensive,Petrol,5,36937,First Owner,Manual,2018,21.4,1197,1197,831,6.4
+316,2019 Toyota Innova Crysta 2.4 VX MT,Apr-19,Third Party insurance,Diesel,7,42000,First Owner,Manual,2019,13.68,2393,2393,14751,18.75
+317,2019 BMW 5 Series 520d Luxury Line,Jul-19,Comprehensive,Diesel,5,55000,First Owner,Automatic,2019,20.37,1995,1995,18774,41.5
+318,2019 Maruti Baleno Delta,May-19,Comprehensive,Petrol,5,70391,Second Owner,Manual,2019,21.01,1197,1197,8180,5.12
+319,2014 Hyundai Elantra SX,Jan-14,Third Party insurance,Petrol,5,56000,First Owner,Manual,2014,16.3,1797,1797,1475,4.95
+320,2016 Hyundai Grand i10 Sportz,Aug-16,Comprehensive,Petrol,5,52190,First Owner,Manual,2016,18.9,1197,1197,82,4.31
+321,2014 Mercedes-Benz C-Class C 220 CDI Grand Edition,2014,Third Party insurance,Diesel,5,40000,First Owner,Automatic,2014,11.78,2143,2143,16762,9.99
+322,2018 Audi A3 35 TDI Premium Plus,Oct-18,Comprehensive,Diesel,5,72000,First Owner,Automatic,2018,20.38,1968,1968,143,20
+323,2013 Maruti Wagon R VXi BSII,Sep-13,Comprehensive,Petrol,5,48173,First Owner,Manual,2013,998,671,671,90,2.88
+324,2012 BMW 3 Series 320i Touring,2012,Third Party insurance,Petrol,5,110000,Second Owner,Automatic,2012,12.05,1995,1995,154,7.3
+325,2012 Honda City V MT,2012,Third Party insurance,Petrol,5,50000,First Owner,Manual,2012,16.8,1497,1497,1163,3.39
+326,2019 Mercedes-Benz CLA Urban Sport 200d,Dec-19,Third Party insurance,Diesel,5,44132,Second Owner,Automatic,2019,17.9,2143,2143,1341,26.9
+327,2015 Honda City i VTEC VX,2015,Third Party insurance,Petrol,5,90000,Third Owner,Manual,2015,17.4,1497,1497,1173,4.75
+328,2020 Ford Endeavour Titanium Plus 4X4 AT,Dec-20,Comprehensive,Diesel,7,49000,First Owner,Automatic,2020,12.4,1996,1996,16762,33.5
+329,2021 Audi Q2 Premium Plus I,Jan-21,Comprehensive,Petrol,5,28000,First Owner,Automatic,2021,1984,18774,18774,320,26.5
+330,2011 Maruti Swift Dzire 1.2 Vxi BSIV,Mar-11,Comprehensive,Petrol,5,89002,First Owner,Manual,2011,17.5,1197,1197,858,2.37
+331,2019 Hyundai Venue SX Turbo,Jul-19,Comprehensive,Petrol,5,28194,First Owner,Manual,2019,18.27,998,998,11835,9.03
+332,2019 BMW 5 Series 530i M Sport,Aug-19,Comprehensive,Petrol,5,34500,First Owner,Automatic,2019,15.01,1998,1998,24808,52
+333,2019 Mercedes-Benz E-Class Exclusive E 220 d BSIV,Sep-19,Zero Dep,Diesel,5,50605,Second Owner,Automatic,2019,16.1,1950,1950,1917,39.9
+334,2018 Maruti Baleno 1.2 Alpha,Sep-18,Comprehensive,Petrol,5,36937,First Owner,Manual,2018,21.4,1197,1197,831,6.4
+335,2019 Toyota Innova Crysta 2.4 VX MT,Apr-19,Third Party insurance,Diesel,7,42000,First Owner,Manual,2019,13.68,2393,2393,14751,18.75
+336,2019 BMW 5 Series 520d Luxury Line,Jul-19,Comprehensive,Diesel,5,55000,First Owner,Automatic,2019,20.37,1995,1995,18774,41.5
+337,2019 Maruti Baleno Delta,May-19,Comprehensive,Petrol,5,70391,Second Owner,Manual,2019,21.01,1197,1197,8180,5.12
+338,2014 Hyundai Elantra SX,Jan-14,Third Party insurance,Petrol,5,56000,First Owner,Manual,2014,16.3,1797,1797,1475,4.95
+339,2016 Hyundai Grand i10 Sportz,Aug-16,Comprehensive,Petrol,5,52190,First Owner,Manual,2016,18.9,1197,1197,82,4.31
+340,2014 Mercedes-Benz C-Class C 220 CDI Grand Edition,2014,Third Party insurance,Diesel,5,40000,First Owner,Automatic,2014,11.78,2143,2143,16762,9.99
+341,2018 Audi A3 35 TDI Premium Plus,Oct-18,Comprehensive,Diesel,5,72000,First Owner,Automatic,2018,20.38,1968,1968,143,20
+342,2013 Maruti Wagon R VXi BSII,Sep-13,Comprehensive,Petrol,5,48173,First Owner,Manual,2013,998,671,671,90,2.88
+343,2012 BMW 3 Series 320i Touring,2012,Third Party insurance,Petrol,5,110000,Second Owner,Automatic,2012,12.05,1995,1995,154,7.3
+344,2012 Honda City V MT,2012,Third Party insurance,Petrol,5,50000,First Owner,Manual,2012,16.8,1497,1497,1163,3.39
+345,2019 Mercedes-Benz CLA Urban Sport 200d,Dec-19,Third Party insurance,Diesel,5,44132,Second Owner,Automatic,2019,17.9,2143,2143,1341,26.9
+346,2015 Honda City i VTEC VX,2015,Third Party insurance,Petrol,5,90000,Third Owner,Manual,2015,17.4,1497,1497,1173,4.75
+347,2020 Ford Endeavour Titanium Plus 4X4 AT,Dec-20,Comprehensive,Diesel,7,49000,First Owner,Automatic,2020,12.4,1996,1996,16762,33.5
+348,2017 Audi Q7 3.0 TDI Quattro Technology,May-17,Comprehensive,Diesel,7,70000,Second Owner,Automatic,2017,12.07,2967,2967,2414,40
+349,2015 Hyundai Creta 1.6 Gamma SX Plus,Oct-15,Comprehensive,Petrol,5,49341,First Owner,Manual,2015,15.29,1591,1591,1213,8.42
+350,2018 Isuzu MU-X 4X2,Oct-18,Comprehensive,Diesel,7,55000,First Owner,Automatic,2018,13.8,2999,2999,175,18.95
+351,2019 Hyundai Creta 1.4 S,Jun-19,Comprehensive,Diesel,5,55861,First Owner,Manual,2019,22.1,1396,1396,887,10.27
+352,2018 Land Rover Discovery HSE 3.0 Si6,Jul-18,Third Party insurance,Petrol,7,76000,Second Owner,Automatic,2018,9.17,2995,2995,33525,49.5
+353,2018 Toyota Innova Crysta 2.4 G MT,Jul-18,Comprehensive,Diesel,7,68000,First Owner,Manual,2018,13.68,2393,2393,14751,14.25
+354,2014 Honda Amaze VX i-VTEC,May-14,Comprehensive,Petrol,5,52565,First Owner,Manual,2014,17.8,1198,1198,867,4.17
+355,2018 Volvo S90 D4 Momentum,Nov-18,Comprehensive,Diesel,5,72000,First Owner,Automatic,2018,18,1969,1969,190,29.55
+356,2017 Audi Q7 45 TDI Quattro Technology,Aug-17,Comprehensive,Diesel,7,70000,Second Owner,Automatic,2017,14.75,2967,2967,245,40
+357,2019 Hyundai Grand i10 1.2 Kappa Sportz BSIV,Jul-19,Comprehensive,Petrol,5,73074,First Owner,Manual,2019,18.9,1197,1197,8186,4.93
+358,2019 Tata Harrier XZ,Jun-19,Third Party insurance,Diesel,5,45000,First Owner,Manual,2019,16.35,1956,1956,16767,13.75
+359,2014 Hyundai Grand i10 Magna,Jun-14,Comprehensive,Petrol,5,90995,First Owner,Manual,2014,1197,82,82,114,3.35
+360,2017 Renault KWID 1.0 RXT Optional AT 2016-2019,2017,Third Party insurance,Petrol,5,30000,First Owner,Automatic,2017,23.01,999,999,67,3.35
+361,2014 Honda City i DTEC V,2014,Third Party insurance,Diesel,5,80000,1498 cc,2014,Power Steering,1498,986,986,200,4.75
+362,2014 Maruti Wagon R LXI BS IV,Mar-14,Third Party,Petrol,5,42346,Second Owner,Manual,2014,20.51,998,998,6704,3.01
+363,2020 Honda City i-VTEC CVT VX,Aug-20,Comprehensive,Petrol,5,31120,First Owner,Automatic,2020,18,1497,1497,1176,11.5
+364,2014 Hyundai Verna 1.6 SX CRDI (O) AT,2014,Third Party insurance,Diesel,5,100000,First Owner,Automatic,2014,22.32,1582,1582,12632,3.95
+365,2018 Toyota Yaris J CVT BSIV,2018,Third Party insurance,Petrol,5,33500,First Owner,Automatic,2018,17.8,1496,1496,1055,7.5
+366,2015 Hyundai Grand i10 Magna CNG,Oct-15,Comprehensive,CNG,5,64000,First Owner,Manual,2015,1197,82,82,114,4.25
+367,2011 Honda City 1.5 S MT,2011,Third Party insurance,Petrol,5,110000,1497 cc,2011,Power Steering,1497,1186600,1186600,1464800,3.5
+368,2017 Audi Q7 3.0 TDI Quattro Technology,May-17,Comprehensive,Diesel,7,70000,Second Owner,Automatic,2017,12.07,2967,2967,2414,40
+369,2015 Hyundai Creta 1.6 Gamma SX Plus,Oct-15,Comprehensive,Petrol,5,49341,First Owner,Manual,2015,15.29,1591,1591,1213,8.42
+370,2018 Isuzu MU-X 4X2,Oct-18,Comprehensive,Diesel,7,55000,First Owner,Automatic,2018,13.8,2999,2999,175,18.95
+371,2019 Hyundai Creta 1.4 S,Jun-19,Comprehensive,Diesel,5,55861,First Owner,Manual,2019,22.1,1396,1396,887,10.27
+372,2018 Land Rover Discovery HSE 3.0 Si6,Jul-18,Third Party insurance,Petrol,7,76000,Second Owner,Automatic,2018,9.17,2995,2995,33525,49.5
+373,2018 Toyota Innova Crysta 2.4 G MT,Jul-18,Comprehensive,Diesel,7,68000,First Owner,Manual,2018,13.68,2393,2393,14751,14.25
+374,2014 Honda Amaze VX i-VTEC,May-14,Comprehensive,Petrol,5,52565,First Owner,Manual,2014,17.8,1198,1198,867,4.17
+375,2018 Volvo S90 D4 Momentum,Nov-18,Comprehensive,Diesel,5,72000,First Owner,Automatic,2018,18,1969,1969,190,29.55
+376,2017 Audi Q7 45 TDI Quattro Technology,Aug-17,Comprehensive,Diesel,7,70000,Second Owner,Automatic,2017,14.75,2967,2967,245,40
+377,2019 Hyundai Grand i10 1.2 Kappa Sportz BSIV,Jul-19,Comprehensive,Petrol,5,73074,First Owner,Manual,2019,18.9,1197,1197,8186,4.93
+378,2019 Tata Harrier XZ,Jun-19,Third Party insurance,Diesel,5,45000,First Owner,Manual,2019,16.35,1956,1956,16767,13.75
+379,2014 Hyundai Grand i10 Magna,Jun-14,Comprehensive,Petrol,5,90995,First Owner,Manual,2014,1197,82,82,114,3.35
+380,2017 Renault KWID 1.0 RXT Optional AT 2016-2019,2017,Third Party insurance,Petrol,5,30000,First Owner,Automatic,2017,23.01,999,999,67,3.35
+381,2014 Honda City i DTEC V,2014,Third Party insurance,Diesel,5,80000,1498 cc,2014,Power Steering,1498,986,986,200,4.75
+382,2014 Maruti Wagon R LXI BS IV,Mar-14,Third Party,Petrol,5,42346,Second Owner,Manual,2014,20.51,998,998,6704,3.01
+383,2020 Honda City i-VTEC CVT VX,Aug-20,Comprehensive,Petrol,5,31120,First Owner,Automatic,2020,18,1497,1497,1176,11.5
+384,2014 Hyundai Verna 1.6 SX CRDI (O) AT,2014,Third Party insurance,Diesel,5,100000,First Owner,Automatic,2014,22.32,1582,1582,12632,3.95
+385,2018 Toyota Yaris J CVT BSIV,2018,Third Party insurance,Petrol,5,33500,First Owner,Automatic,2018,17.8,1496,1496,1055,7.5
+386,2015 Hyundai Grand i10 Magna CNG,Oct-15,Comprehensive,CNG,5,64000,First Owner,Manual,2015,1197,82,82,114,4.25
+387,2011 Honda City 1.5 S MT,2011,Third Party insurance,Petrol,5,110000,1497 cc,2011,Power Steering,1497,1186600,1186600,1464800,3.5
+388,2022 BMW 7 Series 740Li M Sport,Oct-22,Comprehensive,Petrol,4,4000,First Owner,Automatic,2022,11.86,2998,2998,33525,1.25
+389,2011 Maruti A-Star Zxi,May-12,Comprehensive,Petrol,5,48936,Second Owner,Manual,2011,19,998,998,661,2.34
+390,2019 Mitsubishi Outlander 2.4 CVT,Mar-19,Comprehensive,Petrol,7,23000,Second Owner,Automatic,2019,10.2,2360,2360,16494,19.5
+391,2017 Maruti Baleno 1.2 Zeta,Sep-17,Comprehensive,Petrol,5,61814,First Owner,Manual,2017,21.4,1197,1197,831,5.27
+392,2019 BMW X5 xDrive 30d xLine,Jan-19,Zero Dep,Diesel,5,62000,Second Owner,Automatic,2019,13.38,2993,2993,26150,47.98
+393,2017 Volkswagen Polo GT TSI Sport Edition,2017,Third Party insurance,Petrol,5,40000,First Owner,Automatic,2017,17.21,1197,1197,1035,10
+394,2020 Hyundai Venue SX Turbo,Dec-20,Comprehensive,Petrol,5,30200,First Owner,Manual,2020,18.27,998,998,11835,9.25
+395,2020 Skoda Superb LK 1.8 TSI AT,Aug-20,Third Party insurance,Petrol,5,34123,First Owner,Automatic,2020,14.67,1798,1798,17746,30.5
+396,2022 Mercedes-Benz AMG GLC 43 4MATIC Coupe,May-22,Comprehensive,Petrol,5,16000,First Owner,Automatic,2022,2996,38487,38487,520,83
+397,2018 Maruti Vitara Brezza ZDi Plus Dual Tone,Oct-18,Comprehensive,Diesel,5,28645,First Owner,Manual,2018,24.3,1248,1248,885,7.71
+398,2015 Audi A4 35 TDI Premium,Mar-15,Comprehensive,Diesel,5,48933,Second Owner,Automatic,2015,17.11,1968,1968,17433,15.75
+399,2016 Hyundai Creta 1.6 VTVT AT SX Plus,May-16,Comprehensive,Petrol,5,60970,First Owner,Automatic,2016,13,1591,1591,1213,9.4
+400,2017 Hyundai Creta 1.6 VTVT AT SX Plus,2017,Third Party insurance,Petrol,5,50000,First Owner,Automatic,2017,13,1591,1591,1213,7.75
+401,2018 Toyota Fortuner 2.8 4WD MT,Mar-18,Third Party insurance,Diesel,7,56000,First Owner,Manual,2018,14.24,2755,2755,1745,27.5
+402,2018 Hyundai Grand i10 1.2 Kappa Asta,Jul-18,Comprehensive,Petrol,5,40427,First Owner,Manual,2018,18.9,1197,1197,8186,5.36
+403,2019 Maruti Ciaz 1.4 Delta,Sep-19,Third Party insurance,Petrol,5,54213,First Owner,Manual,2019,20.73,1373,1373,911,7.9
+404,2021 Ford Endeavour Titanium Plus 4X4 AT,2021,Third Party insurance,Diesel,7,20000,1996 cc,2021,Power Steering,1996,16762,16762,420,32
+405,2011 Toyota Corolla Altis G,May-11,Third Party insurance,Petrol,5,85000,Second Owner,Manual,2011,14.53,1798,1798,1381,2.75
+406,2016 Toyota Innova Crysta 2.4 G MT 8 STR,Oct-16,Comprehensive,Diesel,8,91000,Second Owner,Manual,2016,13.68,2393,2393,14751,12
+407,2016 Hyundai Grand i10 Sportz,Oct-16,Third Party insurance,Petrol,5,47000,First Owner,Manual,2016,18.9,1197,1197,82,3.85
+408,2015 Honda City i VTEC CVT VX,Sep-15,Comprehensive,Petrol,5,54630,First Owner,Automatic,2015,18,1497,1497,1173,6.86
+409,2015 Audi Q7 45 TDI Quattro Technology,Mar-16,Comprehensive,Diesel,7,72222,Second Owner,Automatic,2015,14.75,2967,2967,245,34.9
+410,2019 Honda City i-VTEC CVT ZX,Mar-20,Comprehensive,Petrol,5,41116,First Owner,Automatic,2019,18,1497,1497,1176,10.39
+411,2019 Land Rover Range Rover Sport 2.0 Petrol SE,Feb-19,Zero Dep,Petrol,5,4000,First Owner,Automatic,2019,12.65,1997,1997,29636,1.1
+412,2017 Jaguar XJ 2.0L Portfolio,Aug-17,Comprehensive,Petrol,5,20000,First Owner,Automatic,2017,9.43,1999,1999,2374,69
+413,2021 Tata Altroz XZ Plus BSVI,Jan-23,Comprehensive,Petrol,5,29502,First Owner,Manual,2021,19.33,1199,1199,8683,7.56
+414,2014 BMW X5 xDrive 30d M Sport,Jan-14,Comprehensive,Diesel,5,132501,First Owner,Automatic,2014,15.97,2993,2993,258,12.21
+415,2017 Mercedes-Benz E-Class E250 CDI Avantgarde,May-17,Comprehensive,Diesel,5,35000,First Owner,Automatic,2017,13,2143,2143,204,23.9
+416,2017 Honda WR-V i-DTEC VX,Oct-17,Comprehensive,Diesel,5,56458,Second Owner,Manual,2017,25.5,1498,1498,986,5.71
+417,2018 Maruti Ciaz 1.4 AT Alpha,Sep-18,Comprehensive,Petrol,5,50000,First Owner,Automatic,2018,19.12,1373,1373,911,7.25
+418,2018 Maruti Baleno 1.2 Zeta,Aug-18,Comprehensive,Petrol,5,61657,First Owner,Manual,2018,21.4,1197,1197,831,5.93
+419,2016 Honda City i VTEC CVT VX,2016,Third Party insurance,Petrol,5,50000,First Owner,Automatic,2016,18,1497,1497,1173,6.5
+420,2017 Maruti Ciaz 1.4 Zeta,Oct-17,Third Party insurance,Petrol,5,67000,First Owner,Manual,2017,20.73,1373,1373,911,6.25
+421,2016 Hyundai i20 Sportz 1.2,Jan-16,Comprehensive,Petrol,5,104948,First Owner,Manual,2016,18.6,1197,1197,8183,4.61
+422,2017 Jaguar XJ 2.0L Portfolio,Sep-17,Comprehensive,Petrol,5,20000,First Owner,Automatic,2017,9.43,1999,1999,2374,52
+423,2023 Kia Seltos HTK Plus,2023,Third Party insurance,Petrol,5,10000,First Owner,Manual,2023,17,1497,1497,11342,15.21
+424,2014 Mercedes-Benz M-Class ML 350 CDI,Mar-14,Comprehensive,Diesel,5,154000,Second Owner,Automatic,2014,11.74,2987,2987,2548,17.5
+425,2016 Toyota Camry 2.5 Hybrid,Sep-16,Comprehensive,Petrol,5,46000,First Owner,Automatic,2016,19.16,2494,2494,1577,20.5
+426,2015 Honda City i VTEC E,Jun-15,Comprehensive,Petrol,5,90000,First Owner,Manual,2015,1497,1173,1173,145,5.65
+427,2016 Hyundai Grand i10 Sportz,Oct-16,Third Party insurance,Petrol,5,47000,First Owner,Manual,2016,18.9,1197,1197,82,3.85
+428,2015 Honda City i VTEC CVT VX,Sep-15,Comprehensive,Petrol,5,54630,First Owner,Automatic,2015,18,1497,1497,1173,6.86
+429,2015 Audi Q7 45 TDI Quattro Technology,Mar-16,Comprehensive,Diesel,7,72222,Second Owner,Automatic,2015,14.75,2967,2967,245,34.9
+430,2019 Honda City i-VTEC CVT ZX,Mar-20,Comprehensive,Petrol,5,41116,First Owner,Automatic,2019,18,1497,1497,1176,10.39
+431,2019 Land Rover Range Rover Sport 2.0 Petrol SE,Feb-19,Zero Dep,Petrol,5,4000,First Owner,Automatic,2019,12.65,1997,1997,29636,1.1
+432,2017 Jaguar XJ 2.0L Portfolio,Aug-17,Comprehensive,Petrol,5,20000,First Owner,Automatic,2017,9.43,1999,1999,2374,69
+433,2021 Tata Altroz XZ Plus BSVI,Jan-23,Comprehensive,Petrol,5,29502,First Owner,Manual,2021,19.33,1199,1199,8683,7.56
+434,2014 BMW X5 xDrive 30d M Sport,Jan-14,Comprehensive,Diesel,5,132501,First Owner,Automatic,2014,15.97,2993,2993,258,12.21
+435,2017 Mercedes-Benz E-Class E250 CDI Avantgarde,May-17,Comprehensive,Diesel,5,35000,First Owner,Automatic,2017,13,2143,2143,204,23.9
+436,2017 Honda WR-V i-DTEC VX,Oct-17,Comprehensive,Diesel,5,56458,Second Owner,Manual,2017,25.5,1498,1498,986,5.71
+437,2018 Maruti Ciaz 1.4 AT Alpha,Sep-18,Comprehensive,Petrol,5,50000,First Owner,Automatic,2018,19.12,1373,1373,911,7.25
+438,2018 Maruti Baleno 1.2 Zeta,Aug-18,Comprehensive,Petrol,5,61657,First Owner,Manual,2018,21.4,1197,1197,831,5.93
+439,2016 Honda City i VTEC CVT VX,2016,Third Party insurance,Petrol,5,50000,First Owner,Automatic,2016,18,1497,1497,1173,6.5
+440,2017 Maruti Ciaz 1.4 Zeta,Oct-17,Third Party insurance,Petrol,5,67000,First Owner,Manual,2017,20.73,1373,1373,911,6.25
+441,2016 Hyundai i20 Sportz 1.2,Jan-16,Comprehensive,Petrol,5,104948,First Owner,Manual,2016,18.6,1197,1197,8183,4.61
+442,2017 Jaguar XJ 2.0L Portfolio,Sep-17,Comprehensive,Petrol,5,20000,First Owner,Automatic,2017,9.43,1999,1999,2374,52
+443,2023 Kia Seltos HTK Plus,2023,Third Party insurance,Petrol,5,10000,First Owner,Manual,2023,17,1497,1497,11342,15.21
+444,2014 Mercedes-Benz M-Class ML 350 CDI,Mar-14,Comprehensive,Diesel,5,154000,Second Owner,Automatic,2014,11.74,2987,2987,2548,17.5
+445,2016 Toyota Camry 2.5 Hybrid,Sep-16,Comprehensive,Petrol,5,46000,First Owner,Automatic,2016,19.16,2494,2494,1577,20.5
+446,2015 Honda City i VTEC E,Jun-15,Comprehensive,Petrol,5,90000,First Owner,Manual,2015,1497,1173,1173,145,5.65
+447,2020 Audi A3 35 TDI Premium Plus,Jan-20,Comprehensive,Diesel,5,39000,Second Owner,Automatic,2020,20.38,1968,1968,143,22.5
+448,2017 Hyundai Creta 1.6 VTVT AT SX Plus,Aug-17,Comprehensive,Petrol,5,64727,First Owner,Automatic,2017,13,1591,1591,1213,9.87
+449,2018 Hyundai i20 Active 1.4 S,Sep-18,Third Party insurance,Diesel,5,65000,First Owner,Manual,2018,21.19,1396,1396,8873,6.5
+450,2013 Honda Brio S MT,Feb-13,Third Party,Petrol,5,44636,Second Owner,Manual,2013,19.4,1198,1198,868,2.63
+451,2015 Toyota Fortuner 4x2 AT,Aug-15,Comprehensive,Diesel,7,100000,Second Owner,Automatic,2015,12.55,2982,2982,1685,15.5
+452,2021 Mercedes-Benz C-Class Progressive C 220d,Aug-21,Zero Dep,Diesel,5,23616,First Owner,Automatic,2021,12.6,1950,1950,194,43.9
+453,2014 Hyundai Xcent 1.2 Kappa S,Sep-14,Comprehensive,Petrol,5,107682,First Owner,Manual,2014,19.1,1197,1197,82,3.39
+454,2022 Mercedes-Benz AMG GLA 35 4MATIC,Aug-22,Third Party,Petrol,5,9500,First Owner,Automatic,2022,1991,30173,30173,400,56.5
+455,2019 Land Rover Discovery Sport Petrol HSE 7S,Jun-19,Comprehensive,Petrol,7,47500,First Owner,Automatic,2019,12.81,1997,1997,23736,43
+456,2011 Volkswagen Polo Petrol Highline 1.2L,Aug-11,Comprehensive,Petrol,5,101914,Second Owner,Manual,2011,16.47,1198,1198,739,2.59
+457,2023 Hyundai Grand i10 Nios Magna BSVI,Apr-23,Comprehensive,Petrol,5,620,First Owner,Manual,2023,1197,8180,8180,1138,6.65
+458,2019 Maruti Baleno Alpha,Mar-19,Comprehensive,Petrol,5,45507,First Owner,Manual,2019,21.01,1197,1197,8180,6.49
+459,2015 Audi A8 L 3.0 TDI quattro,Jul-15,Comprehensive,Diesel,4,58000,First Owner,Automatic,2015,16.77,2967,2967,24674,29.75
+460,2022 Mercedes-Benz S-Class S 350d BSVI,Oct-22,Comprehensive,Diesel,5,7000,First Owner,Automatic,2022,2925,28161,28161,600,1.55
+461,2015 Ford Ecosport 1.5 Ti VCT AT Titanium,Mar-15,Comprehensive,Petrol,5,74095,Second Owner,Automatic,2015,16.5,1499,1499,110,5.37
+463,2018 Mercedes-Benz S-Class Maybach S500,Jul-18,Comprehensive,Petrol,4,40000,First Owner,Automatic,2018,7.81,4663,4663,459,1.09
+464,2010 Maruti Alto 800 LXi BSIII,Oct-10,Comprehensive,Petrol,5,77684,Second Owner,Manual,2010,796,463,463,62,1.54
+465,2021 Audi Q5 Technology BSVI,Jan-22,Third Party insurance,Petrol,5,22900,First Owner,Automatic,2021,13.47,1984,1984,24559,54.8
+466,2022 Mercedes-Benz A-Class Limousine A 200d BSVI,2022,Third Party insurance,Diesel,5,10000,1950 cc,2022,Power Steering,147.51,320,320,17,42
+468,2014 Hyundai Grand i10 Sportz,Jun-14,Comprehensive,Petrol,5,74846,Second Owner,Manual,2014,18.9,1197,1197,82,3.1
+469,2022 Toyota Glanza S,Nov-22,Comprehensive,Petrol,5,4500,First Owner,Manual,2022,22.35,1197,1197,8850,7.55
+470,2012 Hyundai i20 Magna,Feb-12,Comprehensive,Petrol,5,97722,Third Owner,Manual,2012,18.5,1197,1197,805200,2.27
+471,2023 Jeep Wrangler Rubicon,Feb-23,Third Party insurance,Petrol,5,9000,First Owner,Automatic,2023,12.1,1998,1998,26530,70
+472,2020 Mercedes-Benz AMG GLE 53 Coupe,Feb-20,Third Party,Petrol,5,19000,First Owner,Automatic,2020,8.9,2999,2999,435,78.99
+473,2015 Honda City i VTEC CVT VX,Nov-15,Comprehensive,Petrol,5,79683,First Owner,Automatic,2015,18,1497,1497,1173,6.35
+474,2022 Maruti Swift Dzire VXI AT,Jul-22,Comprehensive,Petrol,5,26000,First Owner,Automatic,2022,22.61,1197,1197,8850,7.95
+475,2016 BMW X1 sDrive 20d xLine,Jul-16,Third Party insurance,Diesel,5,70000,Second Owner,Automatic,2016,20.68,1995,1995,188,15.5
+476,2019 Kia Seltos GTX Plus DCT,Nov-19,Comprehensive,Petrol,5,85540,First Owner,Automatic,2019,16.5,1353,1353,13808,13.86
+477,2023 Mahindra XUV300 W6 Turbo,2023,Third Party insurance,Petrol,5,10000,First Owner,Manual,2023,1197,12873,12873,230,11.7
+478,2019 Maruti Baleno Alpha,Mar-19,Comprehensive,Petrol,5,50170,First Owner,Manual,2019,21.01,1197,1197,8180,6.87
+479,2020 BMW X7 xDrive30d DPE Signature,Jul-20,Comprehensive,Diesel,7,44000,First Owner,Automatic,2020,13.38,2993,2993,26150,98.5
+480,2022 Mercedes-Benz C-Class Progressive C 220d,Dec-22,Comprehensive,Diesel,5,4000,First Owner,Automatic,2022,12.6,1950,1950,194,56.75
+481,2015 Maruti Wagon R VXi BSII,Aug-15,Comprehensive,Petrol,5,37163,Second Owner,Manual,2015,998,671,671,90,3.18
+482,2022 MG Hector Sharp CVT,Jul-22,Third Party insurance,Petrol,5,21003,First Owner,Automatic,2022,1451,141,141,250,18.75
+483,2018 BMW X3 xDrive 20d Luxury Line,Aug-18,Comprehensive,Diesel,5,49000,First Owner,Automatic,2018,16.55,1995,1995,1877,39
+484,2011 Maruti A-Star AT VXI,Jun-11,Comprehensive,Petrol,5,89057,Second Owner,Automatic,2011,16.98,998,998,661,2.26
+485,2021 Mercedes-Benz C-Class Progressive C 200,Nov-21,Comprehensive,Petrol,5,12000,First Owner,Automatic,2021,11.9,1950,1950,20115,44.5
+486,2022 Maruti Vitara Brezza VXI AT,Nov-22,Comprehensive,Petrol,5,11000,First Owner,Automatic,2022,18.76,1462,1462,10326,9.99
+488,2014 Hyundai Grand i10 Sportz,Jun-14,Comprehensive,Petrol,5,74846,Second Owner,Manual,2014,18.9,1197,1197,82,3.1
+489,2022 Toyota Glanza S,Nov-22,Comprehensive,Petrol,5,4500,First Owner,Manual,2022,22.35,1197,1197,8850,7.55
+490,2012 Hyundai i20 Magna,Feb-12,Comprehensive,Petrol,5,97722,Third Owner,Manual,2012,18.5,1197,1197,805200,2.27
+491,2023 Jeep Wrangler Rubicon,Feb-23,Third Party insurance,Petrol,5,9000,First Owner,Automatic,2023,12.1,1998,1998,26530,70
+492,2020 Mercedes-Benz AMG GLE 53 Coupe,Feb-20,Third Party,Petrol,5,19000,First Owner,Automatic,2020,8.9,2999,2999,435,78.99
+493,2015 Honda City i VTEC CVT VX,Nov-15,Comprehensive,Petrol,5,79683,First Owner,Automatic,2015,18,1497,1497,1173,6.35
+494,2022 Maruti Swift Dzire VXI AT,Jul-22,Comprehensive,Petrol,5,26000,First Owner,Automatic,2022,22.61,1197,1197,8850,7.95
+495,2016 BMW X1 sDrive 20d xLine,Jul-16,Third Party insurance,Diesel,5,70000,Second Owner,Automatic,2016,20.68,1995,1995,188,15.5
+496,2019 Kia Seltos GTX Plus DCT,Nov-19,Comprehensive,Petrol,5,85540,First Owner,Automatic,2019,16.5,1353,1353,13808,13.86
+497,2023 Mahindra XUV300 W6 Turbo,2023,Third Party insurance,Petrol,5,10000,First Owner,Manual,2023,1197,12873,12873,230,11.7
+498,2019 Maruti Baleno Alpha,Mar-19,Comprehensive,Petrol,5,50170,First Owner,Manual,2019,21.01,1197,1197,8180,6.87
+499,2020 BMW X7 xDrive30d DPE Signature,Jul-20,Comprehensive,Diesel,7,44000,First Owner,Automatic,2020,13.38,2993,2993,26150,98.5
+500,2022 Mercedes-Benz C-Class Progressive C 220d,Dec-22,Comprehensive,Diesel,5,4000,First Owner,Automatic,2022,12.6,1950,1950,194,56.75
+501,2015 Maruti Wagon R VXi BSII,Aug-15,Comprehensive,Petrol,5,37163,Second Owner,Manual,2015,998,671,671,90,3.18
+502,2022 MG Hector Sharp CVT,Jul-22,Third Party insurance,Petrol,5,21003,First Owner,Automatic,2022,1451,141,141,250,18.75
+503,2018 BMW X3 xDrive 20d Luxury Line,Aug-18,Comprehensive,Diesel,5,49000,First Owner,Automatic,2018,16.55,1995,1995,1877,39
+504,2011 Maruti A-Star AT VXI,Jun-11,Comprehensive,Petrol,5,89057,Second Owner,Automatic,2011,16.98,998,998,661,2.26
+505,2021 Mercedes-Benz C-Class Progressive C 200,Nov-21,Comprehensive,Petrol,5,12000,First Owner,Automatic,2021,11.9,1950,1950,20115,44.5
+506,2022 Maruti Vitara Brezza VXI AT,Nov-22,Comprehensive,Petrol,5,11000,First Owner,Automatic,2022,18.76,1462,1462,10326,9.99
+507,2016 Honda City i VTEC VX Option BL,Aug-16,Comprehensive,Petrol,5,72692,First Owner,Manual,2016,17.8,1497,1497,1173,6.85
+508,2016 Ford Ecosport 1.5 Ti VCT AT Titanium BSIV,Jul-16,Comprehensive,Petrol,5,47463,Second Owner,Automatic,2016,15.63,1499,1499,1104,6.33
+509,2022 Mercedes-Benz GLC 200,Jul-22,Zero Dep,Petrol,5,7651,First Owner,Automatic,2022,12.74,1991,1991,197,61
+510,2014 Honda City i VTEC VX,Jun-14,Comprehensive,Petrol,5,69348,First Owner,Manual,2014,17.8,1497,1497,1173,6.19
+511,2016 Jaguar XJ 3.0L Portfolio,Jul-16,Comprehensive,Diesel,5,40000,First Owner,Automatic,2016,14.47,2993,2993,30173,32.5
+512,2020 Land Rover Range Rover Velar P250 R-Dynamic SE,Nov-20,Comprehensive,Petrol,5,18000,First Owner,Automatic,2020,15.8,1997,1997,247,80
+514,2013 Hyundai Santro Xing GLS CNG,2013,Third Party insurance,CNG,5,40000,Second Owner,Manual,2013,11.88,1086,1086,621,2.1
+515,2016 Mercedes-Benz GLS 350d 4MATIC,Jul-16,Comprehensive,Diesel,7,84000,First Owner,Automatic,2016,11,2987,2987,258,46.21
+516,2013 Maruti Wagon R VXi BSII,Mar-13,Comprehensive,Petrol,5,62411,First Owner,Manual,2013,998,671,671,90,2.9
+517,2022 Maruti Brezza Zxi Plus BSVI,Nov-22,Third Party insurance,Petrol,5,22711,First Owner,Manual,2022,19.89,1462,1462,10165,11.35
+518,2014 Hyundai Grand i10 Sportz,Oct-14,Comprehensive,Petrol,5,90576,First Owner,Manual,2014,18.9,1197,1197,82,3.37
+519,2018 Mercedes-Benz E-Class E 350d,Dec-18,Comprehensive,Diesel,5,44000,First Owner,Automatic,2018,17,2987,2987,2548,44
+520,2017 Maruti Swift LXI Option,Aug-17,Comprehensive,Petrol,5,49000,First Owner,Manual,2017,1197,8180,8180,113,4.25
+521,2019 Hyundai Venue SX Turbo,Jan-20,Comprehensive,Petrol,5,40678,First Owner,Manual,2019,18.27,998,998,11835,9.24
+522,2012 Maruti Wagon R LX BS IV,Jan-12,Comprehensive,Petrol,5,32000,First Owner,Manual,2012,998,6704,6704,90,2.2
+523,2020 Maruti Ertiga ZXI Plus,Mar-20,Comprehensive,Petrol,7,27500,First Owner,Manual,2020,19.01,1462,1462,10326,10.5
+524,2018 Hyundai i20 Sportz 1.2,Jun-18,Comprehensive,Petrol,5,92539,First Owner,Manual,2018,18.6,1197,1197,8183,5.28
+525,2021 BMW 3 Series Gran Limousine 330Li M Sport First Edition,Dec-21,Comprehensive,Petrol,5,21000,First Owner,Automatic,2021,15.3,1998,1998,25479,48
+526,2020 Maruti Baleno 1.2 Zeta,Jun-20,Comprehensive,Petrol,5,6000,First Owner,Manual,2020,21.4,1197,1197,831,6.95
+527,2016 Honda City i VTEC VX Option BL,Aug-16,Comprehensive,Petrol,5,72692,First Owner,Manual,2016,17.8,1497,1497,1173,6.85
+528,2016 Ford Ecosport 1.5 Ti VCT AT Titanium BSIV,Jul-16,Comprehensive,Petrol,5,47463,Second Owner,Automatic,2016,15.63,1499,1499,1104,6.33
+529,2022 Mercedes-Benz GLC 200,Jul-22,Zero Dep,Petrol,5,7651,First Owner,Automatic,2022,12.74,1991,1991,197,61
+530,2014 Honda City i VTEC VX,Jun-14,Comprehensive,Petrol,5,69348,First Owner,Manual,2014,17.8,1497,1497,1173,6.19
+531,2016 Jaguar XJ 3.0L Portfolio,Jul-16,Comprehensive,Diesel,5,40000,First Owner,Automatic,2016,14.47,2993,2993,30173,32.5
+532,2020 Land Rover Range Rover Velar P250 R-Dynamic SE,Nov-20,Comprehensive,Petrol,5,18000,First Owner,Automatic,2020,15.8,1997,1997,247,80
+534,2013 Hyundai Santro Xing GLS CNG,2013,Third Party insurance,CNG,5,40000,Second Owner,Manual,2013,11.88,1086,1086,621,2.1
+535,2016 Mercedes-Benz GLS 350d 4MATIC,Jul-16,Comprehensive,Diesel,7,84000,First Owner,Automatic,2016,11,2987,2987,258,46.21
+536,2013 Maruti Wagon R VXi BSII,Mar-13,Comprehensive,Petrol,5,62411,First Owner,Manual,2013,998,671,671,90,2.9
+537,2022 Maruti Brezza Zxi Plus BSVI,Nov-22,Third Party insurance,Petrol,5,22711,First Owner,Manual,2022,19.89,1462,1462,10165,11.35
+538,2014 Hyundai Grand i10 Sportz,Oct-14,Comprehensive,Petrol,5,90576,First Owner,Manual,2014,18.9,1197,1197,82,3.37
+539,2018 Mercedes-Benz E-Class E 350d,Dec-18,Comprehensive,Diesel,5,44000,First Owner,Automatic,2018,17,2987,2987,2548,44
+540,2017 Maruti Swift LXI Option,Aug-17,Comprehensive,Petrol,5,49000,First Owner,Manual,2017,1197,8180,8180,113,4.25
+541,2019 Hyundai Venue SX Turbo,Jan-20,Comprehensive,Petrol,5,40678,First Owner,Manual,2019,18.27,998,998,11835,9.24
+542,2012 Maruti Wagon R LX BS IV,Jan-12,Comprehensive,Petrol,5,32000,First Owner,Manual,2012,998,6704,6704,90,2.2
+543,2020 Maruti Ertiga ZXI Plus,Mar-20,Comprehensive,Petrol,7,27500,First Owner,Manual,2020,19.01,1462,1462,10326,10.5
+544,2018 Hyundai i20 Sportz 1.2,Jun-18,Comprehensive,Petrol,5,92539,First Owner,Manual,2018,18.6,1197,1197,8183,5.28
+545,2021 BMW 3 Series Gran Limousine 330Li M Sport First Edition,Dec-21,Comprehensive,Petrol,5,21000,First Owner,Automatic,2021,15.3,1998,1998,25479,48
+546,2020 Maruti Baleno 1.2 Zeta,Jun-20,Comprehensive,Petrol,5,6000,First Owner,Manual,2020,21.4,1197,1197,831,6.95
+547,2022 Mahindra XUV700 AX7 AT Luxury Pack,May-22,Comprehensive,Petrol,7,5000,First Owner,Automatic,2022,1999,19713,19713,380,26.5
+548,2019 Tata Tiago XZ Plus,Sep-19,Comprehensive,Petrol,5,16570,First Owner,Manual,2019,23.84,1199,1199,8383,5.23
+549,2022 Maruti Wagon R VXI,Aug-22,Comprehensive,Petrol,5,11000,First Owner,Manual,2022,21.79,998,998,6705,5.75
+550,2017 Honda WR-V i-VTEC VX,Oct-17,Comprehensive,Petrol,5,39791,First Owner,Manual,2017,17.5,1199,1199,887,6.92
+551,2017 Mahindra XUV500 W8 2WD,May-17,Comprehensive,Diesel,7,138000,First Owner,Manual,2017,16,2179,2179,140,6.95
+552,2023 Mercedes-Benz G G 63 AMG,Aug-23,Comprehensive,Petrol,5,3000,First Owner,Automatic,2023,8.13,3982,3982,57663,4
+553,2012 Maruti Swift Dzire LXI,Mar-12,Comprehensive,Petrol,5,94176,First Owner,Manual,2012,1197,8850,8850,113,2.67
+554,2023 Porsche Cayenne 3.6 S Platinum Edition,Sep-23,Comprehensive,Petrol,5,11000,First Owner,Automatic,2023,12.5,3604,3604,420,1.47
+555,2019 Kia Seltos GTK,Oct-19,Comprehensive,Petrol,5,30000,First Owner,Manual,2019,16.1,1353,1353,138,13.25
+556,2021 Volkswagen Taigun 1.5 TSI GT BSVI,Jan-22,Comprehensive,Petrol,5,49594,First Owner,Manual,2021,18.47,1498,1498,14751,13.37
+557,2012 Volkswagen Polo Petrol Comfortline 1.2L,Nov-12,Comprehensive,Petrol,5,60000,First Owner,Manual,2012,16.47,1198,1198,739,2.7
+558,2015 Honda Brio S MT,Feb-16,Comprehensive,Petrol,5,76441,First Owner,Manual,2015,19.4,1198,1198,868,3.26
+559,2014 Mercedes-Benz M-Class ML 350 CDI,Jul-14,Third Party insurance,Diesel,5,75000,Second Owner,Automatic,2014,11.74,2987,2987,2548,17.75
+560,2017 Maruti Wagon R VXI AMT,Jul-17,Comprehensive,Petrol,5,53000,First Owner,Automatic,2017,21.79,998,998,6705,3.95
+561,2017 Hyundai Creta 1.6 Gamma SX Plus,Sep-17,Comprehensive,Petrol,5,56572,First Owner,Manual,2017,15.29,1591,1591,1213,9.31
+562,2018 Maruti Baleno Alpha,Jul-18,Comprehensive,Petrol,5,27210,First Owner,Manual,2018,21.01,1197,1197,8180,6
+563,2017 Mercedes-Benz GLE 400 4MATIC,Jul-17,Comprehensive,Petrol,5,56000,First Owner,Automatic,2017,9.7,2996,2996,32855,45.75
+564,2014 Hyundai i20 Asta 1.2,Nov-14,Comprehensive,Petrol,5,62677,First Owner,Manual,2014,18.6,1197,1197,8183,4.92
+565,2023 Maruti Baleno Delta,Jan-23,Comprehensive,Petrol,5,18000,First Owner,Manual,2023,22.35,1197,1197,8850,7.5
+566,2019 BMW 5 Series 520d Luxury Line,Oct-19,Comprehensive,Diesel,5,35000,First Owner,Automatic,2019,20.37,1995,1995,18774,45
+567,2022 Mahindra XUV700 AX7 AT Luxury Pack,May-22,Comprehensive,Petrol,7,5000,First Owner,Automatic,2022,1999,19713,19713,380,26.5
+568,2019 Tata Tiago XZ Plus,Sep-19,Comprehensive,Petrol,5,16570,First Owner,Manual,2019,23.84,1199,1199,8383,5.23
+569,2022 Maruti Wagon R VXI,Aug-22,Comprehensive,Petrol,5,11000,First Owner,Manual,2022,21.79,998,998,6705,5.75
+570,2017 Honda WR-V i-VTEC VX,Oct-17,Comprehensive,Petrol,5,39791,First Owner,Manual,2017,17.5,1199,1199,887,6.92
+571,2017 Mahindra XUV500 W8 2WD,May-17,Comprehensive,Diesel,7,138000,First Owner,Manual,2017,16,2179,2179,140,6.95
+572,2023 Mercedes-Benz G G 63 AMG,Aug-23,Comprehensive,Petrol,5,3000,First Owner,Automatic,2023,8.13,3982,3982,57663,4
+573,2012 Maruti Swift Dzire LXI,Mar-12,Comprehensive,Petrol,5,94176,First Owner,Manual,2012,1197,8850,8850,113,2.67
+574,2023 Porsche Cayenne 3.6 S Platinum Edition,Sep-23,Comprehensive,Petrol,5,11000,First Owner,Automatic,2023,12.5,3604,3604,420,1.47
+575,2019 Kia Seltos GTK,Oct-19,Comprehensive,Petrol,5,30000,First Owner,Manual,2019,16.1,1353,1353,138,13.25
+576,2021 Volkswagen Taigun 1.5 TSI GT BSVI,Jan-22,Comprehensive,Petrol,5,49594,First Owner,Manual,2021,18.47,1498,1498,14751,13.37
+577,2012 Volkswagen Polo Petrol Comfortline 1.2L,Nov-12,Comprehensive,Petrol,5,60000,First Owner,Manual,2012,16.47,1198,1198,739,2.7
+578,2015 Honda Brio S MT,Feb-16,Comprehensive,Petrol,5,76441,First Owner,Manual,2015,19.4,1198,1198,868,3.26
+579,2014 Mercedes-Benz M-Class ML 350 CDI,Jul-14,Third Party insurance,Diesel,5,75000,Second Owner,Automatic,2014,11.74,2987,2987,2548,17.75
+580,2017 Maruti Wagon R VXI AMT,Jul-17,Comprehensive,Petrol,5,53000,First Owner,Automatic,2017,21.79,998,998,6705,3.95
+581,2017 Hyundai Creta 1.6 Gamma SX Plus,Sep-17,Comprehensive,Petrol,5,56572,First Owner,Manual,2017,15.29,1591,1591,1213,9.31
+582,2018 Maruti Baleno Alpha,Jul-18,Comprehensive,Petrol,5,27210,First Owner,Manual,2018,21.01,1197,1197,8180,6
+583,2017 Mercedes-Benz GLE 400 4MATIC,Jul-17,Comprehensive,Petrol,5,56000,First Owner,Automatic,2017,9.7,2996,2996,32855,45.75
+584,2014 Hyundai i20 Asta 1.2,Nov-14,Comprehensive,Petrol,5,62677,First Owner,Manual,2014,18.6,1197,1197,8183,4.92
+585,2023 Maruti Baleno Delta,Jan-23,Comprehensive,Petrol,5,18000,First Owner,Manual,2023,22.35,1197,1197,8850,7.5
+586,2019 BMW 5 Series 520d Luxury Line,Oct-19,Comprehensive,Diesel,5,35000,First Owner,Automatic,2019,20.37,1995,1995,18774,45
+587,2019 BMW X5 xDrive 30d xLine,Jul-19,Comprehensive,Diesel,5,38000,Second Owner,Automatic,2019,13.38,2993,2993,26150,46.21
+588,2018 Renault Captur 1.5 Diesel RXE,Jun-18,Comprehensive,Diesel,5,109495,First Owner,Manual,2018,20.37,1461,1461,10849,6.53
+590,2015 Audi A4 2.0 TDI Premium Plus,Jan-15,Third Party insurance,Diesel,5,43600,Second Owner,Automatic,2015,17.11,1968,1968,17433,11.9
+591,2020 Mercedes-Benz C-Class Progressive C 220d,Oct-20,Comprehensive,Diesel,5,30000,First Owner,Automatic,2020,12.6,1950,1950,194,37.5
+592,2018 Maruti SX4 S Cross Zeta DDiS 200 SH,Apr-18,Comprehensive,Diesel,5,45240,First Owner,Manual,2018,25.1,1248,1248,885,7.34
+593,2018 Datsun RediGO 1.0 T Option,May-18,Comprehensive,Petrol,5,3600,First Owner,Manual,2018,22.5,999,999,67,3.45
+594,2021 Mercedes-Benz G G 350d,Sep-23,Comprehensive,Diesel,5,36000,First Owner,Automatic,2021,8.13,2925,2925,28161,2.05
+595,2020 Maruti Baleno Zeta,Jan-21,Comprehensive,Petrol,5,59090,First Owner,Manual,2020,21.01,1197,1197,8180,6.42
+596,2012 Audi Q3 35 TDI Quattro Premium,Nov-12,Comprehensive,Diesel,5,126000,First Owner,Automatic,2012,15.73,1968,1968,17433,6.5
+597,2014 Hyundai Grand i10 Sportz,Feb-15,Comprehensive,Petrol,5,70717,First Owner,Manual,2014,18.9,1197,1197,82,3.86
+598,2014 Mercedes-Benz S-Class S 500 L,Jul-14,Comprehensive,Petrol,5,65000,First Owner,Automatic,2014,7.81,5461,5461,3629,47.5
+599,2013 Honda City i VTEC S,Apr-13,Comprehensive,Petrol,5,73086,Second Owner,Manual,2013,17.4,1497,1497,1173,3.75
+600,2020 Tata Nexon XZ Plus BSVI,Feb-20,Comprehensive,Petrol,5,51690,First Owner,Manual,2020,17.33,1199,1199,11835,8.52
+601,2018 BMW X1 sDrive20d Expedition,Mar-18,Comprehensive,Diesel,5,49000,First Owner,Automatic,2018,20.68,1995,1995,188,19.45
+602,2019 Mercedes-Benz E-Class Expression E 200 BSIV,Dec-19,Comprehensive,Petrol,5,25000,First Owner,Automatic,2019,15,1991,1991,1944,49.75
+603,2019 Hyundai Santro Sportz BSIV,Dec-19,Comprehensive,Petrol,5,23592,First Owner,Manual,2019,20.3,1086,1086,68,4.71
+604,2014 Honda City i VTEC V,Dec-14,Comprehensive,Petrol,5,69000,Second Owner,Manual,2014,17.4,1497,1497,1173,4.9
+605,2016 Hyundai Creta 1.6 SX Automatic,Jun-16,Comprehensive,Petrol,5,70000,First Owner,Automatic,2016,14.8,1591,1591,1213,7.95
+606,2023 Mercedes-Benz S-Class S450 4Matic,Nov-23,Comprehensive,Petrol,5,3500,First Owner,Automatic,2023,2999,36207,36207,500,1.78
+607,2015 Honda Brio S MT,Sep-15,Comprehensive,Petrol,5,64155,First Owner,Manual,2015,19.4,1198,1198,868,3.18
+608,2018 Mercedes-Benz A Class A200 CDI,Jul-18,Comprehensive,Diesel,5,38000,First Owner,Automatic,2018,20,2143,2143,1073,17.49
+609,2017 Hyundai Xcent 1.2 VTVT E Plus,Aug-17,Comprehensive,Petrol,5,68018,First Owner,Manual,2017,20.14,1197,1197,8186,4.12
+610,2022 Toyota Hyryder V AWD BSVI,Jul-22,Comprehensive,Petrol,5,14000,First Owner,Manual,2022,19.39,1462,1462,10164,19.9
+611,2018 Honda WR-V i-VTEC VX,Apr-18,Comprehensive,Petrol,5,29846,First Owner,Manual,2018,17.5,1199,1199,887,7.6
+612,2017 Tata Tiago XZ,Nov-17,Comprehensive,Petrol,5,26092,First Owner,Manual,2017,23.84,1199,1199,8383,4.5
+613,2019 Maruti Swift Dzire LXI 1.2,Aug-19,Comprehensive,Petrol,5,50823,First Owner,Manual,2019,1197,8180,8180,113,5.5
+614,2020 BMW X6 Xdrive40i M Sport,Oct-20,Third Party insurance,Petrol,5,5200,First Owner,Automatic,2020,10.31,2998,2998,33525,69.75
+615,2018 Mahindra Marazzo M8,Feb-19,Comprehensive,Diesel,7,36050,First Owner,Manual,2018,17.3,1497,1497,121,8.99
+616,2017 Honda City i-VTEC CVT VX,Dec-17,Comprehensive,Petrol,5,90932,First Owner,Automatic,2017,18,1497,1497,1176,7.86
+617,2021 Tata Harrier XZA Plus (O) AT BSVI,Aug-21,Comprehensive,Diesel,5,53000,First Owner,Automatic,2021,14.6,1956,1956,16767,20
+618,2020 Mercedes-Benz C-Class Progressive C 220d,Mar-21,Zero Dep,Diesel,5,11848,Second Owner,Automatic,2020,12.6,1950,1950,194,39.9
+619,2014 Honda Mobilio V i-VTEC,Aug-14,Comprehensive,Petrol,7,73580,First Owner,Manual,2014,17.3,1497,1497,1173,4.66
+620,2019 Jeep Compass 1.4 Limited,Mar-19,Comprehensive,Petrol,5,22600,First Owner,Automatic,2019,16,1368,1368,160,14.9
+621,2019 Audi A4 35 TDI Technology,Dec-19,Comprehensive,Diesel,5,36000,First Owner,Automatic,2019,18.25,1968,1968,18774,27.5
+622,2021 Tata Altroz XE Diesel,Apr-21,Comprehensive,Diesel,5,44275,First Owner,Manual,2021,1497,8877,8877,200,6.2
+623,2020 Hyundai i20 Magna Plus,Sep-20,Comprehensive,Petrol,5,52000,First Owner,Manual,2020,18.6,1197,1197,8186,6.25
+624,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,30000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+625,2021 Tata Safari XZA Plus AT,Jul-21,Comprehensive,Diesel,7,26000,Second Owner,Automatic,2021,14.08,1956,1956,16767,20
+626,2018 Maruti Ciaz 1.4 Delta,Jul-18,Comprehensive,Petrol,5,45239,First Owner,Manual,2018,20.73,1373,1373,911,6.33
+627,2017 Mercedes-Benz GLA Class 200,Dec-17,Comprehensive,Petrol,5,51000,Second Owner,Automatic,2017,13.7,1991,1991,183,21
+628,2019 Maruti Vitara Brezza ZDi Plus AMT,May-19,Comprehensive,Diesel,5,102973,First Owner,Automatic,2019,24.3,1248,1248,885,7.99
+629,2016 Audi A6 35 TDI,Sep-16,Comprehensive,Diesel,5,87000,Second Owner,Automatic,2016,18.53,1968,1968,18774,19
+630,2014 Maruti Swift Dzire ZXI,2014,Third Party insurance,Petrol,5,40000,Second Owner,Manual,2014,19.1,1197,1197,858,3.7
+631,2014 Hyundai Grand i10 Sportz,Feb-15,Comprehensive,Petrol,5,63952,Second Owner,Manual,2014,18.9,1197,1197,82,3.55
+632,2018 Mahindra XUV500 W11 AT BSIV,Oct-18,Comprehensive,Diesel,7,58000,Second Owner,Automatic,2018,15.1,2179,2179,15287,12
+633,2023 Audi Q8 Standard,Nov-23,Comprehensive,Petrol,5,7000,First Owner,Automatic,2023,9.8,2995,2995,340,1.12
+634,2019 Tata Nexon 1.2 Revotron XZA Plus DualTone,Jun-19,Comprehensive,Petrol,5,46310,First Owner,Automatic,2019,17,1198,1198,1085,8.74
+635,2020 MG Hector Plus Sharp DCT,Nov-20,Comprehensive,Petrol,6,42000,First Owner,Automatic,2020,11.67,1451,1451,141,16
+636,2015 Honda City i VTEC VX Option,May-15,Comprehensive,Petrol,5,94498,First Owner,Manual,2015,17.8,1497,1497,1173,5.81
+637,2022 Volvo XC60 B5 Ultimate,Nov-22,Comprehensive,Petrol,5,9300,First Owner,Automatic,2022,11.2,1969,1969,250,66
+638,2019 BMW X5 xDrive 30d xLine,Nov-19,Comprehensive,Diesel,5,37000,First Owner,Automatic,2019,13.38,2993,2993,26150,71.99
+639,2019 Honda WR-V i-DTEC V,Sep-19,Comprehensive,Diesel,5,144234,First Owner,Manual,2019,25.5,1498,1498,986,5.52
+640,2017 Maruti Swift Dzire VXI Optional,Jul-17,Comprehensive,Petrol,5,48000,First Owner,Manual,2017,20.85,1197,1197,8314,5.1
+641,2021 Land Rover Range Rover Velar R-Dynamic S Petrol,Nov-21,Comprehensive,Petrol,5,19000,Second Owner,Automatic,2021,15.8,1997,1997,24674,80
+642,2016 Hyundai i20 Sportz 1.2,Dec-16,Comprehensive,Petrol,5,114658,First Owner,Manual,2016,18.6,1197,1197,8183,5.21
+643,2015 Audi A4 2.0 TDI Premium Plus,Oct-15,Comprehensive,Diesel,5,71000,First Owner,Automatic,2015,17.11,1968,1968,17433,12.65
+644,2022 Maruti Swift LXI BSVI,Dec-22,Comprehensive,Petrol,5,8000,First Owner,Manual,2022,1197,8850,8850,113,5.95
+645,2021 Tata Safari XZA Plus AT,Jul-21,Comprehensive,Diesel,7,26000,Second Owner,Automatic,2021,14.08,1956,1956,16767,20
+646,2018 Maruti Ciaz 1.4 Delta,Jul-18,Comprehensive,Petrol,5,45239,First Owner,Manual,2018,20.73,1373,1373,911,6.33
+647,2017 Mercedes-Benz GLA Class 200,Dec-17,Comprehensive,Petrol,5,51000,Second Owner,Automatic,2017,13.7,1991,1991,183,21
+648,2019 Maruti Vitara Brezza ZDi Plus AMT,May-19,Comprehensive,Diesel,5,102973,First Owner,Automatic,2019,24.3,1248,1248,885,7.99
+649,2016 Audi A6 35 TDI,Sep-16,Comprehensive,Diesel,5,87000,Second Owner,Automatic,2016,18.53,1968,1968,18774,19
+650,2014 Maruti Swift Dzire ZXI,2014,Third Party insurance,Petrol,5,40000,Second Owner,Manual,2014,19.1,1197,1197,858,3.7
+651,2014 Hyundai Grand i10 Sportz,Feb-15,Comprehensive,Petrol,5,63952,Second Owner,Manual,2014,18.9,1197,1197,82,3.55
+652,2018 Mahindra XUV500 W11 AT BSIV,Oct-18,Comprehensive,Diesel,7,58000,Second Owner,Automatic,2018,15.1,2179,2179,15287,12
+653,2023 Audi Q8 Standard,Nov-23,Comprehensive,Petrol,5,7000,First Owner,Automatic,2023,9.8,2995,2995,340,1.12
+654,2019 Tata Nexon 1.2 Revotron XZA Plus DualTone,Jun-19,Comprehensive,Petrol,5,46310,First Owner,Automatic,2019,17,1198,1198,1085,8.74
+655,2020 MG Hector Plus Sharp DCT,Nov-20,Comprehensive,Petrol,6,42000,First Owner,Automatic,2020,11.67,1451,1451,141,16
+656,2015 Honda City i VTEC VX Option,May-15,Comprehensive,Petrol,5,94498,First Owner,Manual,2015,17.8,1497,1497,1173,5.81
+657,2022 Volvo XC60 B5 Ultimate,Nov-22,Comprehensive,Petrol,5,9300,First Owner,Automatic,2022,11.2,1969,1969,250,66
+658,2019 BMW X5 xDrive 30d xLine,Nov-19,Comprehensive,Diesel,5,37000,First Owner,Automatic,2019,13.38,2993,2993,26150,71.99
+659,2019 Honda WR-V i-DTEC V,Sep-19,Comprehensive,Diesel,5,144234,First Owner,Manual,2019,25.5,1498,1498,986,5.52
+660,2017 Maruti Swift Dzire VXI Optional,Jul-17,Comprehensive,Petrol,5,48000,First Owner,Manual,2017,20.85,1197,1197,8314,5.1
+661,2021 Land Rover Range Rover Velar R-Dynamic S Petrol,Nov-21,Comprehensive,Petrol,5,19000,Second Owner,Automatic,2021,15.8,1997,1997,24674,80
+662,2016 Hyundai i20 Sportz 1.2,Dec-16,Comprehensive,Petrol,5,114658,First Owner,Manual,2016,18.6,1197,1197,8183,5.21
+663,2015 Audi A4 2.0 TDI Premium Plus,Oct-15,Comprehensive,Diesel,5,71000,First Owner,Automatic,2015,17.11,1968,1968,17433,12.65
+664,2022 Maruti Swift LXI BSVI,Dec-22,Comprehensive,Petrol,5,8000,First Owner,Manual,2022,1197,8850,8850,113,5.95
+665,2018 BMW X3 xDrive 20d Luxury Line,Jul-18,Comprehensive,Diesel,5,28000,First Owner,Automatic,2018,16.55,1995,1995,1877,39.9
+666,2019 Honda WR-V i-VTEC VX,Nov-19,Comprehensive,Petrol,5,38616,First Owner,Manual,2019,17.5,1199,1199,887,7.41
+667,2019 Skoda Octavia 1.8 TSI AT L K,Nov-19,Comprehensive,Petrol,5,30000,First Owner,Automatic,2019,15.1,1798,1798,178,21.5
+668,2018 Hyundai i20 Asta Option 1.2,Apr-18,Comprehensive,Petrol,5,33093,First Owner,Manual,2018,18.6,1197,1197,8183,6.81
+669,2019 BMW X1 sDrive 20D xLine,Aug-19,Comprehensive,Diesel,5,33000,First Owner,Automatic,2019,17.05,1995,1995,184,29
+670,2019 Toyota Innova Crysta 2.8 GX AT BSIV,Oct-19,Comprehensive,Diesel,7,57000,First Owner,Automatic,2019,11.36,2755,2755,1715,17.5
+671,2018 Renault Duster 85PS Diesel RxS,Jun-18,Comprehensive,Diesel,5,75206,First Owner,Manual,2018,19.87,1461,1461,838,6.49
+672,2019 Jeep Compass 1.4 Limited Option,2019,Third Party insurance,Petrol,5,40000,Second Owner,Automatic,2019,16,1368,1368,160,15
+673,2016 Mercedes-Benz CLA 200 CDI Sport,Jul-16,Third Party insurance,Diesel,5,42000,Second Owner,Automatic,2016,17.9,2143,2143,136,17.6
+674,2016 Hyundai Grand i10 Sportz,Jan-17,Comprehensive,Petrol,5,96241,First Owner,Manual,2016,18.9,1197,1197,82,3.77
+675,2022 Maruti Ertiga ZXI CNG,Aug-22,Comprehensive,CNG,7,34214,First Owner,Manual,2022,26.11,1462,1462,8663,12.75
+676,2015 Maruti Ciaz ZXi,Dec-15,Comprehensive,Petrol,5,55818,First Owner,Manual,2015,20.73,1373,1373,911,6.61
+677,2020 Land Rover Range Rover Velar R-Dynamic S Petrol,Jul-20,Comprehensive,Petrol,5,80000,First Owner,Automatic,2020,15.8,1997,1997,24674,68
+678,2018 Maruti Wagon R LXI CNG,2018,Third Party insurance,CNG,5,40000,First Owner,Manual,2018,26.6,998,998,5816,4
+679,2015 Maruti Wagon R VXi BSII,May-15,Comprehensive,Petrol,5,70516,First Owner,Manual,2015,998,671,671,90,3.11
+680,2020 Maruti Wagon R ZXI AMT 1.2,Dec-20,Comprehensive,Petrol,5,48000,First Owner,Automatic,2020,20.52,1197,1197,8180,5.75
+681,2015 BMW 5 Series 520d Luxury Line,Nov-15,Third Party insurance,Diesel,5,94000,First Owner,Automatic,2015,20.37,1995,1995,18774,16.9
+682,2016 Hyundai Creta 1.6 Gamma SX Plus,Feb-16,Comprehensive,Petrol,5,80627,First Owner,Manual,2016,15.29,1591,1591,1213,8.16
+683,2015 Skoda Rapid 1.6 MPI AT Elegance Plus Black Package,Feb-15,Comprehensive,Petrol,5,49000,First Owner,Automatic,2015,14.3,1598,1598,10352,5.25
+684,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,18.2
+685,2020 Lexus RX 450hL,Nov-20,Comprehensive,Petrol,5,19000,First Owner,Automatic,2020,18.8,3456,3456,25881,82
+686,2017 Honda WR-V i-VTEC VX,Nov-17,Comprehensive,Petrol,5,53311,First Owner,Manual,2017,17.5,1199,1199,887,6.75
+687,2018 Hyundai i20 Magna Plus BSIV,Dec-18,Comprehensive,Petrol,5,70000,First Owner,Manual,2018,18.6,1197,1197,8186,5.85
+688,2016 Hyundai i20 Magna 1.2,Apr-16,Comprehensive,Petrol,5,108836,First Owner,Manual,2016,18.6,1197,1197,8183,4.49
+689,2018 BMW X5 xDrive30d Edition X,Jul-18,Comprehensive,Diesel,5,40000,First Owner,Automatic,2018,15.97,2993,2993,258,42.5
+690,2017 Maruti Vitara Brezza ZDi,2017,Third Party insurance,Diesel,5,120000,First Owner,Manual,2017,24.3,1248,1248,885,6
+691,2016 Maruti Ciaz AT ZXi,Oct-16,Comprehensive,Petrol,5,44525,First Owner,Automatic,2016,19.12,1373,1373,911,6.93
+692,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,31500,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+693,2015 BMW X5 xDrive 30d Design Pure Experience 5 Seater,Sep-15,Comprehensive,Diesel,5,80000,First Owner,Automatic,2015,15.97,2993,2993,258,26.5
+694,2018 Honda WR-V i-VTEC VX,Aug-18,Comprehensive,Petrol,5,64862,First Owner,Manual,2018,17.5,1199,1199,887,6.07
+695,2012 Honda City V MT,2012,Third Party insurance,Petrol,5,100000,Second Owner,Manual,2012,16.8,1497,1497,1163,2.95
+696,2016 Maruti Baleno 1.2 Alpha,May-16,Comprehensive,Petrol,5,63839,First Owner,Manual,2016,21.4,1197,1197,831,5.59
+697,2022 Mercedes-Benz AMG GLC 43 4MATIC Coupe,Dec-22,Comprehensive,Petrol,5,14000,First Owner,Automatic,2022,2996,38487,38487,520,81.9
+698,2014 Hyundai Grand i10 Asta,2014,Third Party insurance,Petrol,5,50000,First Owner,Manual,2014,18.9,1197,1197,82,3.75
+699,2019 Mahindra XUV300 W8 Diesel BSIV,Jan-19,Comprehensive,Diesel,5,113820,First Owner,Manual,2019,20,1497,1497,115,7.89
+700,2017 Maruti Ciaz ZDi Plus SHVS,2017,Third Party insurance,Diesel,5,110000,First Owner,Manual,2017,28.09,1248,1248,885,5
+701,2018 Hyundai Creta 1.6 E Plus,Nov-18,Third Party insurance,Petrol,5,31000,First Owner,Manual,2018,15.8,1591,1591,1213,8.65
+702,2018 Maruti Swift Dzire AMT ZDI,Mar-18,Comprehensive,Diesel,5,97610,First Owner,Automatic,2018,28.4,1248,1248,7402,5.64
+703,2019 Nissan Sunny XV CVT,Jun-19,Comprehensive,Petrol,5,44000,First Owner,Automatic,2019,17.5,1498,1498,996,6.25
+704,2019 Mercedes-Benz C-Class Prime C 220d,Mar-20,Third Party insurance,Diesel,5,34496,First Owner,Automatic,2019,12.6,1950,1950,194,3932
+706,2016 Maruti Baleno 1.2 Alpha,Mar-16,Comprehensive,Petrol,5,75163,First Owner,Manual,2016,21.4,1197,1197,831,5.14
+707,2022 Maruti Ciaz Alpha BSVI,Oct-22,Third Party insurance,Petrol,5,6900,First Owner,Manual,2022,20.65,1462,1462,10325,10.25
+708,2015 Honda Amaze S i-Vtech,Jun-15,Comprehensive,Petrol,5,89961,Second Owner,Manual,2015,18,1198,1198,867,3.74
+709,2022 BMW 3 Series Gran Limousine 320Ld Luxury Line,Dec-22,Comprehensive,Diesel,5,4000,First Owner,Automatic,2022,19.62,1995,1995,18740,54
+710,2021 Tata Harrier XZA Plus AT,Oct-21,Comprehensive,Diesel,5,54000,First Owner,Automatic,2021,14.6,1956,1956,16767,17.5
+711,2019 Maruti Swift AMT ZXI Plus,Mar-19,Comprehensive,Petrol,5,58740,Second Owner,Automatic,2019,21.21,1197,1197,8180,5.99
+712,2019 Toyota Innova Crysta 2.8 GX AT BSIV,2019,Third Party insurance,Diesel,7,100000,First Owner,Automatic,2019,11.36,2755,2755,1715,15.5
+713,2020 Land Rover Range Rover Velar R-Dynamic S Petrol,Oct-22,Comprehensive,Petrol,5,18700,First Owner,Automatic,2020,15.8,1997,1997,24674,83
+714,2017 Honda Amaze S i-VTEC,Apr-17,Comprehensive,Petrol,5,83690,First Owner,Manual,2017,17.8,1198,1198,867,4.54
+715,2018 Mercedes-Benz E-Class Expression E 200 BSIV,Nov-18,Third Party insurance,Petrol,5,11000,First Owner,Automatic,2018,15,1991,1991,1944,50
+716,2012 Toyota Etios Liva G,Jul-12,Comprehensive,Petrol,5,50900,First Owner,Manual,2012,17.71,1197,1197,789,2.95
+717,2021 Mercedes-Benz E-Class Exclusive E 220d,Dec-21,Comprehensive,Diesel,5,25000,First Owner,Automatic,2021,16.1,1950,1950,19176,64
+718,2015 Hyundai Grand i10 Asta Option,May-15,Comprehensive,Petrol,5,78651,First Owner,Manual,2015,18.9,1197,1197,82,3.79
+719,2019 Maruti Ciaz Zeta BSIV,Feb-19,Comprehensive,Petrol,5,50000,First Owner,Manual,2019,21.56,1462,1462,10325,7.5
+720,2023 Volkswagen Virtus Highline BSVI,Apr-23,Comprehensive,Petrol,5,9818,First Owner,Manual,2023,19.4,999,999,11398,13.9
+721,2019 Maruti SX4 S Cross Zeta DDiS 200 SH,Jul-19,Comprehensive,Diesel,5,49230,First Owner,Manual,2019,25.1,1248,1248,885,8.7
+722,2018 Hyundai Verna VTVT 1.6 AT EX,Mar-18,Comprehensive,Petrol,5,65000,First Owner,Automatic,2018,17,1591,1591,1213,8.85
+723,2017 BMW X1 sDrive 20d xLine,May-17,Comprehensive,Diesel,5,69000,First Owner,Automatic,2017,20.68,1995,1995,188,19.932
+725,2016 Maruti Baleno 1.2 Alpha,Mar-16,Comprehensive,Petrol,5,75163,First Owner,Manual,2016,21.4,1197,1197,831,5.14
+726,2022 Maruti Ciaz Alpha BSVI,Oct-22,Third Party insurance,Petrol,5,6900,First Owner,Manual,2022,20.65,1462,1462,10325,10.25
+727,2015 Honda Amaze S i-Vtech,Jun-15,Comprehensive,Petrol,5,89961,Second Owner,Manual,2015,18,1198,1198,867,3.74
+728,2022 BMW 3 Series Gran Limousine 320Ld Luxury Line,Dec-22,Comprehensive,Diesel,5,4000,First Owner,Automatic,2022,19.62,1995,1995,18740,54
+729,2021 Tata Harrier XZA Plus AT,Oct-21,Comprehensive,Diesel,5,54000,First Owner,Automatic,2021,14.6,1956,1956,16767,17.5
+730,2019 Maruti Swift AMT ZXI Plus,Mar-19,Comprehensive,Petrol,5,58740,Second Owner,Automatic,2019,21.21,1197,1197,8180,5.99
+731,2019 Toyota Innova Crysta 2.8 GX AT BSIV,2019,Third Party insurance,Diesel,7,100000,First Owner,Automatic,2019,11.36,2755,2755,1715,15.5
+732,2020 Land Rover Range Rover Velar R-Dynamic S Petrol,Oct-22,Comprehensive,Petrol,5,18700,First Owner,Automatic,2020,15.8,1997,1997,24674,83
+733,2017 Honda Amaze S i-VTEC,Apr-17,Comprehensive,Petrol,5,83690,First Owner,Manual,2017,17.8,1198,1198,867,4.54
+734,2018 Mercedes-Benz E-Class Expression E 200 BSIV,Nov-18,Third Party insurance,Petrol,5,11000,First Owner,Automatic,2018,15,1991,1991,1944,50
+735,2012 Toyota Etios Liva G,Jul-12,Comprehensive,Petrol,5,50900,First Owner,Manual,2012,17.71,1197,1197,789,2.95
+736,2021 Mercedes-Benz E-Class Exclusive E 220d,Dec-21,Comprehensive,Diesel,5,25000,First Owner,Automatic,2021,16.1,1950,1950,19176,64
+737,2015 Hyundai Grand i10 Asta Option,May-15,Comprehensive,Petrol,5,78651,First Owner,Manual,2015,18.9,1197,1197,82,3.79
+738,2019 Maruti Ciaz Zeta BSIV,Feb-19,Comprehensive,Petrol,5,50000,First Owner,Manual,2019,21.56,1462,1462,10325,7.5
+739,2023 Volkswagen Virtus Highline BSVI,Apr-23,Comprehensive,Petrol,5,9818,First Owner,Manual,2023,19.4,999,999,11398,13.9
+740,2019 Maruti SX4 S Cross Zeta DDiS 200 SH,Jul-19,Comprehensive,Diesel,5,49230,First Owner,Manual,2019,25.1,1248,1248,885,8.7
+741,2018 Hyundai Verna VTVT 1.6 AT EX,Mar-18,Comprehensive,Petrol,5,65000,First Owner,Automatic,2018,17,1591,1591,1213,8.85
+742,2017 BMW X1 sDrive 20d xLine,May-17,Comprehensive,Diesel,5,69000,First Owner,Automatic,2017,20.68,1995,1995,188,19.9
+743,2018 Jeep Compass 2.0 Sport,Nov-18,Third Party insurance,Diesel,5,67000,First Owner,Manual,2018,17.1,1956,1956,170,10.9
+744,2018 Ford Ecosport 1.5 Petrol Titanium BSIV,Jul-18,Comprehensive,Petrol,5,76685,First Owner,Manual,2018,17,1497,1497,12131,6.95
+745,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,30000,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+746,2019 Nissan Kicks XV Premium D BSIV,Jan-20,Comprehensive,Diesel,5,101954,First Owner,Manual,2019,20.45,1461,1461,1085,6.68
+747,2017 Ford Endeavour 3.2 Titanium AT 4X4,Jul-17,Comprehensive,Diesel,7,42000,Second Owner,Automatic,2017,10.91,3198,3198,197,24.5
+748,2017 Honda Jazz 1.2 S i VTEC,Jul-17,Third Party insurance,Petrol,5,42000,First Owner,Manual,2017,18.7,1199,1199,887,5.45
+749,2016 Hyundai Grand i10 Asta Option AT,Aug-16,Comprehensive,Petrol,5,68897,First Owner,Automatic,2016,18.9,1197,1197,82,5
+750,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,30000,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+751,2021 BMW 6 Series GT 630i M Sport,Dec-21,Third Party insurance,Petrol,4,26000,First Owner,Automatic,2021,13.32,1998,1998,25479,65
+752,2017 Maruti SX4 S Cross DDiS 200 Zeta,Feb-17,Comprehensive,Diesel,5,105568,Second Owner,Manual,2017,23.65,1248,1248,885,4.63
+753,2018 Ford Endeavour 2.2 Trend AT 4X2,Aug-18,Third Party insurance,Diesel,7,54000,First Owner,Automatic,2018,12.62,2198,2198,158,24
+754,2019 Hyundai Venue SX Plus Turbo DCT,Jul-19,Comprehensive,Petrol,5,61383,First Owner,Automatic,2019,18.15,998,998,11835,9.63
+755,2015 Mercedes-Benz C-Class C 220 CDI Avantgarde,Oct-15,Comprehensive,Diesel,5,75000,Second Owner,Automatic,2015,19.27,2143,2143,170,18.5
+756,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+757,2013 Honda Amaze VX AT i-Vtech,Jul-13,Comprehensive,Petrol,5,77130,Second Owner,Automatic,2013,15.5,1198,1198,867,4
+758,2018 Volvo XC40 D4 R-Design,Aug-18,Zero Dep,Diesel,5,56426,First Owner,Automatic,2018,18,1969,1969,190,29.9
+759,2016 Audi Q7 45 TDI Quattro Premium Plus,Jul-16,Third Party insurance,Diesel,7,75000,Second Owner,Automatic,2016,14.75,2967,2967,245,39.9
+760,2017 Maruti Ciaz 1.4 Delta,Oct-17,Comprehensive,Petrol,5,69018,First Owner,Manual,2017,20.73,1373,1373,911,5.75
+761,2018 Hyundai Creta 1.6 CRDi SX Option,Dec-18,Comprehensive,Diesel,5,57000,First Owner,Manual,2018,19.67,1582,1582,1262,10.75
+762,2018 Hyundai Creta 1.6 SX,Jul-18,Comprehensive,Petrol,5,76000,First Owner,Manual,2018,15.8,1591,1591,1213,9.3
+763,2018 Jeep Compass 2.0 Sport,Nov-18,Third Party insurance,Diesel,5,67000,First Owner,Manual,2018,17.1,1956,1956,170,10.9
+764,2018 Ford Ecosport 1.5 Petrol Titanium BSIV,Jul-18,Comprehensive,Petrol,5,76685,First Owner,Manual,2018,17,1497,1497,12131,6.95
+765,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,30000,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+766,2019 Nissan Kicks XV Premium D BSIV,Jan-20,Comprehensive,Diesel,5,101954,First Owner,Manual,2019,20.45,1461,1461,1085,6.68
+767,2017 Ford Endeavour 3.2 Titanium AT 4X4,Jul-17,Comprehensive,Diesel,7,42000,Second Owner,Automatic,2017,10.91,3198,3198,197,24.5
+768,2017 Honda Jazz 1.2 S i VTEC,Jul-17,Third Party insurance,Petrol,5,42000,First Owner,Manual,2017,18.7,1199,1199,887,5.45
+769,2016 Hyundai Grand i10 Asta Option AT,Aug-16,Comprehensive,Petrol,5,68897,First Owner,Automatic,2016,18.9,1197,1197,82,5
+770,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,30000,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+771,2021 BMW 6 Series GT 630i M Sport,Dec-21,Third Party insurance,Petrol,4,26000,First Owner,Automatic,2021,13.32,1998,1998,25479,65
+772,2017 Maruti SX4 S Cross DDiS 200 Zeta,Feb-17,Comprehensive,Diesel,5,105568,Second Owner,Manual,2017,23.65,1248,1248,885,4.63
+773,2018 Ford Endeavour 2.2 Trend AT 4X2,Aug-18,Third Party insurance,Diesel,7,54000,First Owner,Automatic,2018,12.62,2198,2198,158,24
+774,2019 Hyundai Venue SX Plus Turbo DCT,Jul-19,Comprehensive,Petrol,5,61383,First Owner,Automatic,2019,18.15,998,998,11835,9.63
+775,2015 Mercedes-Benz C-Class C 220 CDI Avantgarde,Oct-15,Comprehensive,Diesel,5,75000,Second Owner,Automatic,2015,19.27,2143,2143,170,18.5
+776,2017 BMW X1 sDrive20d Expedition,2017,Third Party insurance,Diesel,5,32000,1995 cc,2017,Power Steering,1995,188,188,400,19.5
+777,2013 Honda Amaze VX AT i-Vtech,Jul-13,Comprehensive,Petrol,5,77130,Second Owner,Automatic,2013,15.5,1198,1198,867,4
+778,2018 Volvo XC40 D4 R-Design,Aug-18,Zero Dep,Diesel,5,56426,First Owner,Automatic,2018,18,1969,1969,190,29.9
+779,2016 Audi Q7 45 TDI Quattro Premium Plus,Jul-16,Third Party insurance,Diesel,7,75000,Second Owner,Automatic,2016,14.75,2967,2967,245,39.9
+780,2017 Maruti Ciaz 1.4 Delta,Oct-17,Comprehensive,Petrol,5,69018,First Owner,Manual,2017,20.73,1373,1373,911,5.75
+781,2018 Hyundai Creta 1.6 CRDi SX Option,Dec-18,Comprehensive,Diesel,5,57000,First Owner,Manual,2018,19.67,1582,1582,1262,10.75
+782,2018 Hyundai Creta 1.6 SX,Jul-18,Comprehensive,Petrol,5,76000,First Owner,Manual,2018,15.8,1591,1591,1213,9.3
+783,2021 MG Hector Sharp CVT,Sep-21,Comprehensive,Petrol,5,29000,First Owner,Automatic,2021,1451,141,141,250,16.5
+784,2019 Hyundai Venue SX Plus Turbo DCT,Aug-19,Comprehensive,Petrol,5,65710,Second Owner,Automatic,2019,18.15,998,998,11835,8.66
+785,2019 Maruti Vitara Brezza ZDi,Nov-19,Comprehensive,Diesel,5,51763,First Owner,Manual,2019,24.3,1248,1248,885,8
+786,2021 Maruti SX4 S Cross Alpha,Jan-22,Comprehensive,Petrol,5,19133,First Owner,Manual,2021,18.55,1462,1462,10325,9.74
+787,2018 Hyundai Tucson 2.0 Dual VTVT 2WD AT GLS,Jul-18,Third Party insurance,Petrol,5,22000,First Owner,Automatic,2018,12.95,1999,1999,15288,19.25
+788,2016 Toyota Fortuner 4x4 AT,Jul-16,Third Party,Diesel,7,145000,First Owner,Automatic,2016,12.55,2982,2982,1685,18
+789,2015 Maruti Ciaz ZXi,Jan-16,Comprehensive,Petrol,5,42733,First Owner,Manual,2015,20.73,1373,1373,911,6.82
+790,2017 Audi A4 30 TFSI Technology,May-17,Third Party insurance,Petrol,5,30300,Second Owner,Automatic,2017,17.84,1395,1395,14751,24.8
+791,2022 Mercedes-Benz AMG A 35 4MATIC BSVI,May-22,Comprehensive,Petrol,5,14000,First Owner,Automatic,2022,1991,30173,30173,400,48.5
+792,2019 Renault Duster 85PS Diesel RxS,Aug-19,Comprehensive,Diesel,5,59215,Second Owner,Manual,2019,19.87,1461,1461,838,7.8
+793,2018 Mercedes-Benz S-Class S 450,Mar-18,Third Party,Petrol,5,22000,First Owner,Automatic,2018,7.81,2996,2996,36207,93
+794,2019 Hyundai Creta 1.6 SX Automatic,Nov-19,Comprehensive,Petrol,5,91724,First Owner,Automatic,2019,14.8,1591,1591,1213,10.76
+795,2017 Toyota Fortuner 2.8 2WD AT BSIV,Jul-17,Comprehensive,Diesel,7,52000,Second Owner,Automatic,2017,12.9,2755,2755,1745,25.5
+796,2020 Lexus RX 450hL,Mar-20,Comprehensive,Petrol,5,19900,First Owner,Automatic,2020,18.8,3456,3456,25881,82
+797,2015 Maruti Wagon R VXi BSII,May-15,Comprehensive,Petrol,5,72503,First Owner,Manual,2015,998,671,671,90,3.21
+798,2013 Mercedes-Benz E-Class E 200 CGI Avantgarde,Third Party insurance,Petrol,5 Seats,67000,1796,2013,Power Windows Front,Air Conditioner,285,17,17,5,16.5
+799,2020 Mercedes-Benz GLC Coupe 300d 4MATIC BSVI,Jul-20,Comprehensive,Diesel,5,38000,First Owner,Automatic,2020,16.34,1950,1950,24138,69.5
+800,2017 Maruti Ciaz 1.3 Alpha,Feb-18,Comprehensive,Diesel,5,67633,First Owner,Manual,2017,28.09,1248,1248,885,6.61
+801,2019 BMW 6 Series GT 630d Luxury Line,Mar-19,Comprehensive,Diesel,4,45000,Second Owner,Automatic,2019,17.09,2993,2993,2614,43
+802,2015 Honda Amaze S i-Vtech,Feb-15,Comprehensive,Petrol,5,61000,First Owner,Manual,2015,18,1198,1198,867,4.6
+803,2021 MG Hector Sharp CVT,Sep-21,Comprehensive,Petrol,5,29000,First Owner,Automatic,2021,1451,141,141,250,16.5
+804,2019 Hyundai Venue SX Plus Turbo DCT,Aug-19,Comprehensive,Petrol,5,65710,Second Owner,Automatic,2019,18.15,998,998,11835,8.66
+805,2019 Maruti Vitara Brezza ZDi,Nov-19,Comprehensive,Diesel,5,51763,First Owner,Manual,2019,24.3,1248,1248,885,8
+806,2021 Maruti SX4 S Cross Alpha,Jan-22,Comprehensive,Petrol,5,19133,First Owner,Manual,2021,18.55,1462,1462,10325,9.74
+807,2018 Hyundai Tucson 2.0 Dual VTVT 2WD AT GLS,Jul-18,Third Party insurance,Petrol,5,22000,First Owner,Automatic,2018,12.95,1999,1999,15288,19.25
+808,2016 Toyota Fortuner 4x4 AT,Jul-16,Third Party,Diesel,7,145000,First Owner,Automatic,2016,12.55,2982,2982,1685,18
+809,2015 Maruti Ciaz ZXi,Jan-16,Comprehensive,Petrol,5,42733,First Owner,Manual,2015,20.73,1373,1373,911,6.82
+810,2017 Audi A4 30 TFSI Technology,May-17,Third Party insurance,Petrol,5,30300,Second Owner,Automatic,2017,17.84,1395,1395,14751,24.8
+811,2022 Mercedes-Benz AMG A 35 4MATIC BSVI,May-22,Comprehensive,Petrol,5,14000,First Owner,Automatic,2022,1991,30173,30173,400,48.5
+812,2019 Renault Duster 85PS Diesel RxS,Aug-19,Comprehensive,Diesel,5,59215,Second Owner,Manual,2019,19.87,1461,1461,838,7.8
+813,2018 Mercedes-Benz S-Class S 450,Mar-18,Third Party,Petrol,5,22000,First Owner,Automatic,2018,7.81,2996,2996,36207,93
+814,2019 Hyundai Creta 1.6 SX Automatic,Nov-19,Comprehensive,Petrol,5,91724,First Owner,Automatic,2019,14.8,1591,1591,1213,10.76
+815,2017 Toyota Fortuner 2.8 2WD AT BSIV,Jul-17,Comprehensive,Diesel,7,52000,Second Owner,Automatic,2017,12.9,2755,2755,1745,25.5
+816,2020 Lexus RX 450hL,Mar-20,Comprehensive,Petrol,5,19900,First Owner,Automatic,2020,18.8,3456,3456,25881,82
+817,2015 Maruti Wagon R VXi BSII,May-15,Comprehensive,Petrol,5,72503,First Owner,Manual,2015,998,671,671,90,3.21
+818,2013 Mercedes-Benz E-Class E 200 CGI Avantgarde,Third Party insurance,Petrol,5 Seats,67000,1796,2013,Power Windows Front,Air Conditioner,285,17,17,5,16.5
+819,2020 Mercedes-Benz GLC Coupe 300d 4MATIC BSVI,Jul-20,Comprehensive,Diesel,5,38000,First Owner,Automatic,2020,16.34,1950,1950,24138,69.5
+820,2017 Maruti Ciaz 1.3 Alpha,Feb-18,Comprehensive,Diesel,5,67633,First Owner,Manual,2017,28.09,1248,1248,885,6.61
+821,2019 BMW 6 Series GT 630d Luxury Line,Mar-19,Comprehensive,Diesel,4,45000,Second Owner,Automatic,2019,17.09,2993,2993,2614,43
+822,2015 Honda Amaze S i-Vtech,Feb-15,Comprehensive,Petrol,5,61000,First Owner,Manual,2015,18,1198,1198,867,4.6
+823,2017 Mercedes-Benz C-Class C 220 CDI Avantgarde,Dec-17,Comprehensive,Diesel,5,30000,First Owner,Automatic,2017,19.27,2143,2143,170,27.5
+824,2017 Ford Ecosport 1.5 Ti VCT AT Titanium BSIV,Jun-17,Comprehensive,Petrol,5,103030,First Owner,Automatic,2017,15.63,1499,1499,1104,6.82
+825,2019 Maruti XL6 Alpha,Sep-19,Third Party insurance,Petrol,6,19123,First Owner,Manual,2019,19.01,1462,1462,1032,10.25
+826,2019 Mahindra XUV500 W9 BSIV,Apr-19,Comprehensive,Diesel,7,70767,First Owner,Manual,2019,15.1,2179,2179,15287,11.6
+827,2019 Mercedes-Benz E-Class Expression E 200 BSIV,May-19,Zero Dep,Petrol,5,25000,First Owner,Automatic,2019,15,1991,1991,1944,49.75
+828,2017 Hyundai Creta 1.6 VTVT E Plus,Mar-17,Third Party insurance,Petrol,5,58525,First Owner,Manual,2017,15.29,1591,1591,1213,8.5
+829,2016 Maruti Baleno 1.2 Alpha,Jan-17,Comprehensive,Petrol,5,77353,First Owner,Manual,2016,21.4,1197,1197,831,5.2
+830,2018 Maruti Baleno 1.2 Zeta,Apr-18,Comprehensive,Petrol,5,59200,First Owner,Manual,2018,21.4,1197,1197,831,6.25
+831,2022 Mercedes-Benz GLE 300d,Dec-22,Comprehensive,Diesel,5,25000,Second Owner,Automatic,2022,1950,24138,24138,500,79.9
+832,2018 Maruti SX4 S Cross Zeta DDiS 200 SH,Apr-18,Comprehensive,Diesel,5,99230,First Owner,Manual,2018,25.1,1248,1248,885,6.55
+833,2017 Hyundai i20 1.2 Magna Executive,Apr-17,Comprehensive,Petrol,5,80000,First Owner,Manual,2017,18.6,1197,1197,8183,5.25
+834,2018 Maruti Ciaz 1.4 Delta,Apr-18,Comprehensive,Petrol,5,50840,First Owner,Manual,2018,20.73,1373,1373,911,6.72
+835,2023 Mercedes-Benz C-Class C 200,Jul-23,Comprehensive,Petrol,5,1000,First Owner,Automatic,2023,16.9,1496,1496,20115,59.75
+836,2012 Honda City V AT,2012,Third Party insurance,Petrol,5,150000,First Owner,Automatic,2012,15.6,1497,1497,1163,4.5
+837,2017 Maruti Baleno 1.2 Zeta,May-17,Comprehensive,Petrol,5,111142,First Owner,Manual,2017,21.4,1197,1197,831,5.01
+838,2014 Mercedes-Benz C-Class 200 K AT,Jul-14,Comprehensive,Petrol,5,133477,First Owner,Automatic,2014,11.7,1796,1796,178,8.5
+839,2021 Toyota Fortuner 4X4 Diesel AT,Mar-21,Comprehensive,Diesel,7,23000,First Owner,Automatic,2021,2755,20115,20115,500,43
+840,2018 Maruti SX4 S Cross Zeta DDiS 200 SH,May-18,Comprehensive,Diesel,5,120802,First Owner,Manual,2018,25.1,1248,1248,885,5.97
+841,2021 Tata Safari XZA Plus (O) Adventure Edition AT BSVI,Dec-21,Comprehensive,Diesel,7,41000,Second Owner,Automatic,2021,14.08,1956,1956,16767,20
+842,2015 Toyota Camry Hybrid,2015,Third Party insurance,Petrol,5,50000,Second Owner,Automatic,2015,19.16,2494,2494,1577,12.5
+843,2017 Mercedes-Benz C-Class C 220 CDI Avantgarde,Dec-17,Comprehensive,Diesel,5,30000,First Owner,Automatic,2017,19.27,2143,2143,170,27.5
+844,2017 Ford Ecosport 1.5 Ti VCT AT Titanium BSIV,Jun-17,Comprehensive,Petrol,5,103030,First Owner,Automatic,2017,15.63,1499,1499,1104,6.82
+845,2019 Maruti XL6 Alpha,Sep-19,Third Party insurance,Petrol,6,19123,First Owner,Manual,2019,19.01,1462,1462,1032,10.25
+846,2019 Mahindra XUV500 W9 BSIV,Apr-19,Comprehensive,Diesel,7,70767,First Owner,Manual,2019,15.1,2179,2179,15287,11.6
+847,2019 Mercedes-Benz E-Class Expression E 200 BSIV,May-19,Zero Dep,Petrol,5,25000,First Owner,Automatic,2019,15,1991,1991,1944,49.75
+848,2017 Hyundai Creta 1.6 VTVT E Plus,Mar-17,Third Party insurance,Petrol,5,58525,First Owner,Manual,2017,15.29,1591,1591,1213,8.5
+849,2016 Maruti Baleno 1.2 Alpha,Jan-17,Comprehensive,Petrol,5,77353,First Owner,Manual,2016,21.4,1197,1197,831,5.2
+850,2018 Maruti Baleno 1.2 Zeta,Apr-18,Comprehensive,Petrol,5,59200,First Owner,Manual,2018,21.4,1197,1197,831,6.25
+851,2022 Mercedes-Benz GLE 300d,Dec-22,Comprehensive,Diesel,5,25000,Second Owner,Automatic,2022,1950,24138,24138,500,79.9
+852,2018 Maruti SX4 S Cross Zeta DDiS 200 SH,Apr-18,Comprehensive,Diesel,5,99230,First Owner,Manual,2018,25.1,1248,1248,885,6.55
+853,2017 Hyundai i20 1.2 Magna Executive,Apr-17,Comprehensive,Petrol,5,80000,First Owner,Manual,2017,18.6,1197,1197,8183,5.25
+854,2018 Maruti Ciaz 1.4 Delta,Apr-18,Comprehensive,Petrol,5,50840,First Owner,Manual,2018,20.73,1373,1373,911,6.72
+855,2023 Mercedes-Benz C-Class C 200,Jul-23,Comprehensive,Petrol,5,1000,First Owner,Automatic,2023,16.9,1496,1496,20115,59.75
+856,2012 Honda City V AT,2012,Third Party insurance,Petrol,5,150000,First Owner,Automatic,2012,15.6,1497,1497,1163,4.5
+857,2017 Maruti Baleno 1.2 Zeta,May-17,Comprehensive,Petrol,5,111142,First Owner,Manual,2017,21.4,1197,1197,831,5.01
+858,2014 Mercedes-Benz C-Class 200 K AT,Jul-14,Comprehensive,Petrol,5,133477,First Owner,Automatic,2014,11.7,1796,1796,178,8.5
+859,2021 Toyota Fortuner 4X4 Diesel AT,Mar-21,Comprehensive,Diesel,7,23000,First Owner,Automatic,2021,2755,20115,20115,500,43
+860,2018 Maruti SX4 S Cross Zeta DDiS 200 SH,May-18,Comprehensive,Diesel,5,120802,First Owner,Manual,2018,25.1,1248,1248,885,5.97
+861,2021 Tata Safari XZA Plus (O) Adventure Edition AT BSVI,Dec-21,Comprehensive,Diesel,7,41000,Second Owner,Automatic,2021,14.08,1956,1956,16767,20
+862,2015 Toyota Camry Hybrid,2015,Third Party insurance,Petrol,5,50000,Second Owner,Automatic,2015,19.16,2494,2494,1577,12.5
+863,2021 Mercedes-Benz S-Class S 350 d,Aug-23,Comprehensive,Diesel,5,7900,First Owner,Automatic,2021,13.5,2925,2925,28161,1.5
+864,2019 Maruti Ciaz Alpha AT BSVI,May-19,Comprehensive,Petrol,5,42334,First Owner,Automatic,2019,20.04,1462,1462,10325,8.29
+865,2012 Honda City V AT,2012,Third Party insurance,Petrol,5,150000,First Owner,Automatic,2012,15.6,1497,1497,1163,4.25
+866,2015 Maruti Swift Dzire VXI,Dec-15,Comprehensive,Petrol,5,98275,First Owner,Manual,2015,20.85,1197,1197,8314,3.97
+867,2019 Land Rover Range Rover 3.0 Diesel LWB Vogue,Apr-19,Third Party insurance,Diesel,5,57500,Second Owner,Automatic,2019,13.33,2995,2995,33525,1.8
+868,2018 Honda WR-V i-VTEC VX,Dec-18,Third Party insurance,Petrol,5,65000,First Owner,Manual,2018,17.5,1199,1199,887,6.85
+869,2018 Hyundai Verna VTVT 1.6 SX,Apr-18,Comprehensive,Petrol,5,52235,Second Owner,Manual,2018,17,1591,1591,1213,7.45
+870,2015 Honda City i VTEC V,Nov-15,Comprehensive,Petrol,5,50158,First Owner,Manual,2015,17.4,1497,1497,1173,6.95
+871,2020 Mercedes-Benz E-Class Exclusive E 220d,Jul-20,Comprehensive,Diesel,5,34000,Second Owner,Automatic,2020,16.1,1950,1950,1917,44.9
+872,2017 Nissan Sunny XV CVT,Sep-17,Comprehensive,Petrol,5,69820,First Owner,Automatic,2017,17.5,1498,1498,996,5.44
+873,2019 Toyota Innova Crysta 2.8 ZX AT BSIV,Aug-19,Comprehensive,Diesel,7,71000,First Owner,Automatic,2019,11.36,2755,2755,1715,20.5
+874,2018 Maruti Ignis 1.2 AMT Alpha BSIV,Sep-18,Comprehensive,Petrol,5,82415,First Owner,Automatic,2018,20.89,1197,1197,8180,5.34
+875,2017 Mercedes-Benz GLS 350d 4MATIC,Jul-17,Third Party insurance,Diesel,7,70000,Second Owner,Automatic,2017,11,2987,2987,258,51.5
+876,2012 Honda City V AT,2012,Third Party insurance,Petrol,5,150000,First Owner,Automatic,2012,15.6,1497,1497,1163,4.5
+877,2018 Renault Duster 110PS Diesel RxZ AMT,Oct-18,Comprehensive,Diesel,5,71070,First Owner,Automatic,2018,19.6,1461,1461,10845,7.22
+878,2016 Mercedes-Benz B Class B180 Sport,Apr-16,Third Party insurance,Petrol,5,83000,First Owner,Automatic,2016,14.8,1595,1595,12069,12.65
+879,2020 Hyundai Venue SX Turbo,Jun-20,Comprehensive,Petrol,5,107834,First Owner,Manual,2020,18.27,998,998,11835,7.99
+880,2018 Maruti Baleno Alpha,Oct-18,Comprehensive,Petrol,5,55000,First Owner,Manual,2018,21.01,1197,1197,8180,6.75
+881,2017 Mercedes-Benz GLE 400 4MATIC,Oct-17,Comprehensive,Petrol,5,55000,First Owner,Automatic,2017,9.7,2996,2996,32855,45.45
+882,2021 Mercedes-Benz S-Class S 350 d,Aug-23,Comprehensive,Diesel,5,7900,First Owner,Automatic,2021,13.5,2925,2925,28161,1.5
+883,2019 Maruti Ciaz Alpha AT BSVI,May-19,Comprehensive,Petrol,5,42334,First Owner,Automatic,2019,20.04,1462,1462,10325,8.29
+884,2012 Honda City V AT,2012,Third Party insurance,Petrol,5,150000,First Owner,Automatic,2012,15.6,1497,1497,1163,4.25
+885,2015 Maruti Swift Dzire VXI,Dec-15,Comprehensive,Petrol,5,98275,First Owner,Manual,2015,20.85,1197,1197,8314,3.97
+886,2019 Land Rover Range Rover 3.0 Diesel LWB Vogue,Apr-19,Third Party insurance,Diesel,5,57500,Second Owner,Automatic,2019,13.33,2995,2995,33525,1.8
+887,2018 Honda WR-V i-VTEC VX,Dec-18,Third Party insurance,Petrol,5,65000,First Owner,Manual,2018,17.5,1199,1199,887,6.85
+888,2018 Hyundai Verna VTVT 1.6 SX,Apr-18,Comprehensive,Petrol,5,52235,Second Owner,Manual,2018,17,1591,1591,1213,7.45
+889,2015 Honda City i VTEC V,Nov-15,Comprehensive,Petrol,5,50158,First Owner,Manual,2015,17.4,1497,1497,1173,6.95
+890,2020 Mercedes-Benz E-Class Exclusive E 220d,Jul-20,Comprehensive,Diesel,5,34000,Second Owner,Automatic,2020,16.1,1950,1950,1917,44.9
+891,2017 Nissan Sunny XV CVT,Sep-17,Comprehensive,Petrol,5,69820,First Owner,Automatic,2017,17.5,1498,1498,996,5.44
+892,2019 Toyota Innova Crysta 2.8 ZX AT BSIV,Aug-19,Comprehensive,Diesel,7,71000,First Owner,Automatic,2019,11.36,2755,2755,1715,20.5
+893,2018 Maruti Ignis 1.2 AMT Alpha BSIV,Sep-18,Comprehensive,Petrol,5,82415,First Owner,Automatic,2018,20.89,1197,1197,8180,5.34
+894,2017 Mercedes-Benz GLS 350d 4MATIC,Jul-17,Third Party insurance,Diesel,7,70000,Second Owner,Automatic,2017,11,2987,2987,258,51.5
+895,2012 Honda City V AT,2012,Third Party insurance,Petrol,5,150000,First Owner,Automatic,2012,15.6,1497,1497,1163,4.5
+896,2018 Renault Duster 110PS Diesel RxZ AMT,Oct-18,Comprehensive,Diesel,5,71070,First Owner,Automatic,2018,19.6,1461,1461,10845,7.22
+897,2016 Mercedes-Benz B Class B180 Sport,Apr-16,Third Party insurance,Petrol,5,83000,First Owner,Automatic,2016,14.8,1595,1595,12069,12.65
+898,2020 Hyundai Venue SX Turbo,Jun-20,Comprehensive,Petrol,5,107834,First Owner,Manual,2020,18.27,998,998,11835,7.99
+899,2018 Maruti Baleno Alpha,Oct-18,Comprehensive,Petrol,5,55000,First Owner,Manual,2018,21.01,1197,1197,8180,6.75
+900,2017 Mercedes-Benz GLE 400 4MATIC,Oct-17,Comprehensive,Petrol,5,55000,First Owner,Automatic,2017,9.7,2996,2996,32855,45.45
+901,2020 Volvo XC60 D5 Inscription,Aug-20,Comprehensive,Diesel,5,25000,Second Owner,Automatic,2020,11.2,2400,2400,215,52
+902,2014 Maruti Ritz VXi,Jun-15,Comprehensive,Petrol,5,48539,Second Owner,Manual,2014,1197,8580,8580,114,3.21
+903,2015 Honda City V MT,Sep-15,Comprehensive,Petrol,5,65000,First Owner,Manual,2015,16.8,1497,1497,1163,6.25
+904,2014 Hyundai Grand i10 Sportz,May-14,Comprehensive,Petrol,5,86916,Second Owner,Manual,2014,18.9,1197,1197,82,3.68
+905,2016 Lexus RX 450h F-Sport,Apr-16,Comprehensive,Petrol,5,11000,First Owner,Automatic,2016,18.8,3456,3456,259,66
+906,2019 Tata Nexon 1.2 Revotron XZA Plus DualTone,Mar-19,Comprehensive,Petrol,5,108662,First Owner,Automatic,2019,17,1198,1198,1085,7.12
+907,2012 Honda City V AT,2012,Third Party insurance,Petrol,5,130000,First Owner,Automatic,2012,15.6,1497,1497,1163,4.5
+908,2019 BMW M2 Competition,Feb-19,Comprehensive,Petrol,4,29000,First Owner,Automatic,2019,10.63,2979,2979,410,71
+909,2018 Hyundai Grand i10 1.2 Kappa Asta,Sep-18,Comprehensive,Petrol,5,63307,First Owner,Manual,2018,18.9,1197,1197,8186,5.44
+910,2018 Hyundai Tucson 2.0 e-VGT 4WD AT GLS,Nov-18,Comprehensive,Diesel,5,84000,First Owner,Automatic,2018,16.38,1995,1995,18246,15.9
+911,2016 Maruti Baleno 1.2 Alpha,Jul-16,Comprehensive,Petrol,5,101927,First Owner,Manual,2016,21.4,1197,1197,831,5.14
+912,2017 Mini 3 DOOR John Cooper Works 2019-2020,Nov-17,Comprehensive,Petrol,4,31900,Second Owner,Automatic,2017,16.47,1998,1998,231,31
+913,2015 Mercedes-Benz E-Class E 200 CGI,Nov-15,Comprehensive,Petrol,5,76000,First Owner,Automatic,2015,12,1991,1991,18103,23.9
+914,2019 Maruti Ciaz Alpha AT BSVI,Feb-19,Comprehensive,Petrol,5,40775,Second Owner,Automatic,2019,20.04,1462,1462,10325,8.14
+915,2020 Mercedes-Benz S-Class S 350 d,Apr-20,Third Party,Diesel,5,18346,First Owner,Automatic,2020,13.5,2925,2925,28161,9706
+917,2018 Maruti SX4 S Cross Alpha DDiS 200 SH,Feb-19,Comprehensive,Diesel,5,59710,First Owner,Manual,2018,25.1,1248,1248,885,7.8
+918,2020 Honda City VX CVT,Mar-20,Comprehensive,Petrol,5,40000,First Owner,Automatic,2020,17.4,1497,1497,1176,10.95
+919,2015 Mercedes-Benz M-Class ML 350 4Matic,May-15,Comprehensive,Diesel,5,76000,First Owner,Automatic,2015,2987,1652243800,1652243800,510,19.99
+920,2020 Volvo XC60 D5 Inscription,Aug-20,Comprehensive,Diesel,5,25000,Second Owner,Automatic,2020,11.2,2400,2400,215,52
+921,2014 Maruti Ritz VXi,Jun-15,Comprehensive,Petrol,5,48539,Second Owner,Manual,2014,1197,8580,8580,114,3.21
+922,2015 Honda City V MT,Sep-15,Comprehensive,Petrol,5,65000,First Owner,Manual,2015,16.8,1497,1497,1163,6.25
+923,2014 Hyundai Grand i10 Sportz,May-14,Comprehensive,Petrol,5,86916,Second Owner,Manual,2014,18.9,1197,1197,82,3.68
+924,2016 Lexus RX 450h F-Sport,Apr-16,Comprehensive,Petrol,5,11000,First Owner,Automatic,2016,18.8,3456,3456,259,66
+925,2019 Tata Nexon 1.2 Revotron XZA Plus DualTone,Mar-19,Comprehensive,Petrol,5,108662,First Owner,Automatic,2019,17,1198,1198,1085,7.12
+926,2012 Honda City V AT,2012,Third Party insurance,Petrol,5,130000,First Owner,Automatic,2012,15.6,1497,1497,1163,4.5
+927,2019 BMW M2 Competition,Feb-19,Comprehensive,Petrol,4,29000,First Owner,Automatic,2019,10.63,2979,2979,410,71
+928,2018 Hyundai Grand i10 1.2 Kappa Asta,Sep-18,Comprehensive,Petrol,5,63307,First Owner,Manual,2018,18.9,1197,1197,8186,5.44
+929,2018 Hyundai Tucson 2.0 e-VGT 4WD AT GLS,Nov-18,Comprehensive,Diesel,5,84000,First Owner,Automatic,2018,16.38,1995,1995,18246,15.9
+930,2016 Maruti Baleno 1.2 Alpha,Jul-16,Comprehensive,Petrol,5,101927,First Owner,Manual,2016,21.4,1197,1197,831,5.14
+931,2017 Mini 3 DOOR John Cooper Works 2019-2020,Nov-17,Comprehensive,Petrol,4,31900,Second Owner,Automatic,2017,16.47,1998,1998,231,31
+932,2015 Mercedes-Benz E-Class E 200 CGI,Nov-15,Comprehensive,Petrol,5,76000,First Owner,Automatic,2015,12,1991,1991,18103,23.9
+933,2019 Maruti Ciaz Alpha AT BSVI,Feb-19,Comprehensive,Petrol,5,40775,Second Owner,Automatic,2019,20.04,1462,1462,10325,8.14
+934,2020 Mercedes-Benz S-Class S 350 d,Apr-20,Third Party,Diesel,5,18346,First Owner,Automatic,2020,13.5,2925,2925,28161,9706
+936,2018 Maruti SX4 S Cross Alpha DDiS 200 SH,Feb-19,Comprehensive,Diesel,5,59710,First Owner,Manual,2018,25.1,1248,1248,885,7.8
+937,2020 Honda City VX CVT,Mar-20,Comprehensive,Petrol,5,40000,First Owner,Automatic,2020,17.4,1497,1497,1176,10.95
+938,2015 Mercedes-Benz M-Class ML 350 4Matic,May-15,Comprehensive,Diesel,5,76000,First Owner,Automatic,2015,2987,1652243800,1652243800,510,19.99
+939,2022 Audi Q7 Technology 2022-2022,Aug-22,Comprehensive,Petrol,7,8000,First Owner,Automatic,2022,11.21,2995,2995,33525,87
+940,2019 Honda WR-V i-VTEC VX,Apr-19,Comprehensive,Petrol,5,67606,First Owner,Manual,2019,17.5,1199,1199,887,6.82
+941,2016 Audi Q3 35 TDI Quattro Premium Plus,Sep-16,Third Party insurance,Diesel,5,72135,Second Owner,Automatic,2016,15.73,1968,1968,17433,15.75
+942,2015 Hyundai i20 Asta 1.2,Jul-15,Comprehensive,Petrol,5,96658,First Owner,Manual,2015,18.6,1197,1197,8183,5.1
+943,2017 Audi A4 30 TFSI Premium Plus,Nov-17,Zero Dep,Petrol,5,29000,First Owner,Automatic,2017,17.84,1395,1395,14751,27.25
+944,2017 Audi Q7 45 TDI Quattro Technology,May-17,Comprehensive,Diesel,7,76000,Second Owner,Automatic,2017,14.75,2967,2967,245,45
+945,2017 Maruti Ciaz 1.4 AT Alpha,Dec-17,Comprehensive,Petrol,5,26750,First Owner,Automatic,2017,19.12,1373,1373,911,8.62
+946,2009 Mercedes-Benz S-Class S 350 L,Mar-09,Not Available,Petrol,5,92762,Fifth Owner,Automatic,2009,10.13,3498,3498,3649,8.25
+947,2018 Jaguar XF 2.0 Diesel Portfolio,Jul-18,Comprehensive,Diesel,5,14000,First Owner,Automatic,2018,19.33,1999,1999,177,35.5
+948,2018 Nissan Micra Active XV S,Aug-18,Comprehensive,Petrol,5,43293,First Owner,Manual,2018,19.49,1198,1198,6704,4.12
+949,2017 Honda City 1.5 V MT Exclusive,Aug-17,Comprehensive,Petrol,5,102786,First Owner,Manual,2017,17,1497,1497,1186600,5.95
+950,2015 Nissan Micra Active XV S,Dec-15,Comprehensive,Petrol,5,98751,First Owner,Manual,2015,19.49,1198,1198,6704,2.98
+951,2017 Jeep Grand Cherokee Summit 4X4,Jul-17,Comprehensive,Diesel,5,53000,First Owner,Automatic,2017,12.8,2998,2998,2396,34.9
+952,2017 BMW 3 Series 320d,May-17,Zero Dep,Diesel,5,54776,Second Owner,Automatic,2017,22.69,1995,1995,190,18.9
+953,2018 Maruti Ciaz 1.3 Alpha,Jun-18,Comprehensive,Diesel,5,59870,First Owner,Manual,2018,28.09,1248,1248,885,7.27
+954,2013 Hyundai Grand i10 1.2 Kappa Magna BSIV,Sep-13,Comprehensive,Petrol,5,50000,Second Owner,Manual,2013,18.9,1197,1197,8186,3.95
+955,2021 Mercedes-Benz G G 350d,Apr-21,Comprehensive,Diesel,5,38000,First Owner,Automatic,2021,8.13,2925,2925,28161,2.45
+956,2013 Maruti Ritz VXi,Jan-14,Comprehensive,Petrol,5,80330,First Owner,Manual,2013,1197,8580,8580,114,2.93
+957,2015 Honda City V MT,Nov-15,Third Party insurance,Petrol,5,94000,First Owner,Manual,2015,16.8,1497,1497,1163,6.25
+958,2018 Land Rover Discovery Sport TD4 SE,Nov-18,Zero Dep,Diesel,7,37800,First Owner,Automatic,2018,12.83,1999,1999,14831,37.9
+959,2022 Audi Q7 Technology 2022-2022,Aug-22,Comprehensive,Petrol,7,8000,First Owner,Automatic,2022,11.21,2995,2995,33525,87
+960,2019 Honda WR-V i-VTEC VX,Apr-19,Comprehensive,Petrol,5,67606,First Owner,Manual,2019,17.5,1199,1199,887,6.82
+961,2016 Audi Q3 35 TDI Quattro Premium Plus,Sep-16,Third Party insurance,Diesel,5,72135,Second Owner,Automatic,2016,15.73,1968,1968,17433,15.75
+962,2015 Hyundai i20 Asta 1.2,Jul-15,Comprehensive,Petrol,5,96658,First Owner,Manual,2015,18.6,1197,1197,8183,5.1
+963,2017 Audi A4 30 TFSI Premium Plus,Nov-17,Zero Dep,Petrol,5,29000,First Owner,Automatic,2017,17.84,1395,1395,14751,27.25
+964,2017 Audi Q7 45 TDI Quattro Technology,May-17,Comprehensive,Diesel,7,76000,Second Owner,Automatic,2017,14.75,2967,2967,245,45
+965,2017 Maruti Ciaz 1.4 AT Alpha,Dec-17,Comprehensive,Petrol,5,26750,First Owner,Automatic,2017,19.12,1373,1373,911,8.62
+966,2009 Mercedes-Benz S-Class S 350 L,Mar-09,Not Available,Petrol,5,92762,Fifth Owner,Automatic,2009,10.13,3498,3498,3649,8.25
+967,2018 Jaguar XF 2.0 Diesel Portfolio,Jul-18,Comprehensive,Diesel,5,14000,First Owner,Automatic,2018,19.33,1999,1999,177,35.5
+968,2018 Nissan Micra Active XV S,Aug-18,Comprehensive,Petrol,5,43293,First Owner,Manual,2018,19.49,1198,1198,6704,4.12
+969,2017 Honda City 1.5 V MT Exclusive,Aug-17,Comprehensive,Petrol,5,102786,First Owner,Manual,2017,17,1497,1497,1186600,5.95
+970,2015 Nissan Micra Active XV S,Dec-15,Comprehensive,Petrol,5,98751,First Owner,Manual,2015,19.49,1198,1198,6704,2.98
+971,2017 Jeep Grand Cherokee Summit 4X4,Jul-17,Comprehensive,Diesel,5,53000,First Owner,Automatic,2017,12.8,2998,2998,2396,34.9
+972,2017 BMW 3 Series 320d,May-17,Zero Dep,Diesel,5,54776,Second Owner,Automatic,2017,22.69,1995,1995,190,18.9
+973,2018 Maruti Ciaz 1.3 Alpha,Jun-18,Comprehensive,Diesel,5,59870,First Owner,Manual,2018,28.09,1248,1248,885,7.27
+974,2013 Hyundai Grand i10 1.2 Kappa Magna BSIV,Sep-13,Comprehensive,Petrol,5,50000,Second Owner,Manual,2013,18.9,1197,1197,8186,3.95
+975,2021 Mercedes-Benz G G 350d,Apr-21,Comprehensive,Diesel,5,38000,First Owner,Automatic,2021,8.13,2925,2925,28161,2.45
+976,2013 Maruti Ritz VXi,Jan-14,Comprehensive,Petrol,5,80330,First Owner,Manual,2013,1197,8580,8580,114,2.93
+977,2015 Honda City V MT,Nov-15,Third Party insurance,Petrol,5,94000,First Owner,Manual,2015,16.8,1497,1497,1163,6.25
+978,2018 Land Rover Discovery Sport TD4 SE,Nov-18,Zero Dep,Diesel,7,37800,First Owner,Automatic,2018,12.83,1999,1999,14831,37.9
+979,2019 Audi Q7 45 TDI Quattro Premium Plus,Jul-19,Third Party insurance,Diesel,7,25000,First Owner,Automatic,2019,14.75,2967,2967,245,65.5
+980,2019 Tata Harrier XZ BSVI,Jun-19,Comprehensive,Diesel,5,29294,First Owner,Manual,2019,16.35,1956,1956,16767,13.65
+981,2023 Kia Seltos HTX IVT G,Apr-23,Comprehensive,Petrol,5,6800,First Owner,Automatic,2023,16.8,1497,1497,11342,16.95
+982,2020 Ford Figo Titanium BSIV,Jan-21,Comprehensive,Petrol,5,16847,First Owner,Manual,2020,20.4,1194,1194,9493,5.94
+983,2017 Mercedes-Benz CLA Urban Sport 200d,Jul-17,Comprehensive,Diesel,5,70000,Third Owner,Automatic,2017,17.9,2143,2143,1341,17.5
+984,2022 Audi Q5 Technology BSVI,Oct-22,Third Party insurance,Petrol,5,25500,First Owner,Automatic,2022,13.47,1984,1984,24559,55.8
+985,2018 Renault Duster 110PS Diesel RxZ AMT,Jun-18,Comprehensive,Diesel,5,65865,First Owner,Automatic,2018,19.6,1461,1461,10845,7.99
+986,2021 Audi A6 45 TFSI Technology BSVI,Jul-21,Comprehensive,Petrol,5,1000,First Owner,Automatic,2021,14.11,1984,1984,2413,55.9
+987,2018 Volvo XC60 D4 Momentum,Nov-18,Comprehensive,Diesel,5,60000,Second Owner,Automatic,2018,14.7,1984,1984,181,38
+988,2020 Tata Nexon XZ Plus Diesel S,Jan-21,Comprehensive,Diesel,5,54000,First Owner,Manual,2020,21.19,1497,1497,10849,9.99
+989,2022 BMW 3 Series M340i xDrive,Jul-22,Comprehensive,Petrol,5,5500,First Owner,Automatic,2022,13.02,2998,2998,36878,72
+990,2021 Honda Jazz ZX CVT,Nov-21,Comprehensive,Petrol,5,20866,Second Owner,Automatic,2021,17.1,1199,1199,8850,8.14
+991,2023 Maruti Baleno Alpha AMT BSVI,Apr-23,Comprehensive,Petrol,5,5000,First Owner,Automatic,2023,22.94,1197,1197,8850,9.85
+992,2010 Maruti Swift LXI,Jul-10,Comprehensive,Petrol,5,130363,First Owner,Manual,2010,18.6,1197,1197,858,1.3
+993,2018 Mahindra Marazzo M8,Oct-18,Comprehensive,Diesel,7,73937,First Owner,Manual,2018,17.3,1497,1497,121,8.99
+994,2017 Hyundai Creta 1.4 E Plus CRDi,Sep-17,Comprehensive,Diesel,5,40000,First Owner,Manual,2017,1396,887,887,2197,7.99
+995,2020 Mercedes-Benz GLE 300d,Oct-20,Comprehensive,Diesel,5,15000,Second Owner,Automatic,2020,1950,24138,24138,500,74.5
+996,2018 Nissan Micra Active XV S,Aug-18,Comprehensive,Petrol,5,42014,First Owner,Manual,2018,19.49,1198,1198,6704,4.25
+997,2021 MG Hector Sharp DCT,Jan-21,Comprehensive,Petrol,5,34000,First Owner,Automatic,2021,13.96,1451,1451,141,16.4
+998,2018 Maruti Vitara Brezza ZDi Plus AMT,Mar-18,Third Party insurance,Diesel,5,73000,First Owner,Automatic,2018,24.3,1248,1248,885,7
+999,2019 Maruti SX4 S Cross Zeta DDiS 200 SH,Oct-19,Comprehensive,Diesel,5,59841,First Owner,Manual,2019,25.1,1248,1248,885,8.74
+1000,2021 Kia Seltos HTX IVT G,Nov-21,Zero Dep,Petrol,5,37000,First Owner,Automatic,2021,16.8,1497,1497,11342,15.25
+1001,2012 Toyota Etios Liva G,Jul-12,Comprehensive,Petrol,5,81949,First Owner,Manual,2012,17.71,1197,1197,789,2.92
+1002,2017 Hyundai i10 Magna,Nov-17,Comprehensive,Petrol,5,50000,First Owner,Manual,2017,1197,789,789,1117,4.25
+1003,2013 Hyundai EON D Lite Plus,2013,Third Party insurance,Petrol,5,50000,Second Owner,Manual,2013,814,552,552,745,1.75
+1004,2020 Honda City ZX CVT,Jan-21,Comprehensive,Petrol,5,34769,First Owner,Automatic,2020,18.3,1498,1498,11935,13.08
+1005,2015 Maruti Swift LXI,Dec-15,Comprehensive,Petrol,5,79656,First Owner,Manual,2015,1197,8180,8180,113,3.1
+1006,2019 Mercedes-Benz C-Class Progressive C 220d,May-19,Third Party insurance,Diesel,5,55000,First Owner,Automatic,2019,12.6,1950,1950,194,34.75
+1007,2016 Hyundai i20 Asta Option 1.2,Jan-17,Comprehensive,Petrol,5,84310,First Owner,Manual,2016,18.6,1197,1197,8183,5.64
+1008,2018 Hyundai Grand i10 1.2 Kappa Sportz BSIV,Sep-18,Comprehensive,Petrol,5,23000,First Owner,Manual,2018,18.9,1197,1197,8186,5.15
+1009,2016 Nissan Micra Active XV S,Apr-16,Comprehensive,Petrol,5,79362,First Owner,Manual,2016,19.49,1198,1198,6704,3.42
+1010,2019 BMW X4 M Sport X xDrive20d,Jul-19,Comprehensive,Diesel,5,18000,Second Owner,Automatic,2019,16.55,1995,1995,18774,49.5
+1011,2013 Maruti Ritz VXi,Nov-13,Comprehensive,Petrol,5,102511,First Owner,Manual,2013,1197,8580,8580,114,2.49
+1012,2018 Maruti Ertiga CNG VXI,Jul-18,Comprehensive,CNG,7,70000,First Owner,Manual,2018,26.08,1462,1462,9119,7.65
+1013,2017 Mercedes-Benz GLS 350d 4MATIC,Jul-17,Comprehensive,Diesel,7,80000,Second Owner,Automatic,2017,11,2987,2987,258,48.5
+1014,2015 Hyundai Grand i10 Asta,May-15,Comprehensive,Petrol,5,105446,First Owner,Manual,2015,18.9,1197,1197,82,3.75
+1015,2015 Maruti Baleno 1.2 Delta,Nov-15,Comprehensive,Petrol,5,54000,First Owner,Manual,2015,21.4,1197,1197,831,4.25
+1016,2013 Hyundai i10 Era,Mar-13,Comprehensive,Petrol,5,75865,First Owner,Manual,2013,1086,6805,6805,9904,2.65
+1017,2020 Kia Seltos HTK Plus G,Aug-20,Third Party insurance,Petrol,5,64690,First Owner,Manual,2020,16.8,1497,1497,11343,10
+1018,2022 Hyundai Venue SX BSVI,Jun-22,Third Party,Petrol,5,5103,First Owner,Manual,2022,1197,8180,8180,1138,10.85
+1019,2015 Tata Nano CNG XM,Sep-15,Third Party,CNG,4,52000,Second Owner,Manual,2015,624,3748,3748,51,1.5
+1020,2018 Mahindra KUV 100 mFALCON G80 K2,Mar-18,Comprehensive,Petrol,6,18706,First Owner,Manual,2018,1198,82,82,115,4.24
+1021,2016 Hyundai Xcent 1.2 Kappa S,Feb-17,Third Party,Petrol,5,43687,First Owner,Manual,2016,19.1,1197,1197,82,5.2
+1022,2019 Hyundai Venue SX Plus Turbo DCT BSIV,Jun-19,Third Party insurance,Petrol,5,51000,First Owner,Automatic,2019,18.15,998,998,11835,9.75
+1023,2012 Honda City V MT,Jun-12,Third Party insurance,Petrol,5,60758,Second Owner,Manual,2012,16.8,1497,1497,1163,4.4
+1024,2020 Hyundai Venue SX Opt Diesel BSIV,Jun-22,Third Party insurance,Diesel,5,42000,First Owner,Manual,2020,23.7,1396,1396,887,10.5
+1025,2016 Maruti Vitara Brezza ZDi Plus Dual Tone,May-16,Third Party insurance,Diesel,5,42261,First Owner,Manual,2016,24.3,1248,1248,885,8.85
+1026,2015 Hyundai Grand i10 Magna,Jun-15,Comprehensive,Petrol,5,75499,First Owner,Manual,2015,1197,82,82,114,4.56
+1027,2013 Hyundai Elantra CRDi Base,2013,Third Party insurance,Diesel,5,120000,Third Owner,Manual,2013,22.7,1582,1582,12624,3.99
+1028,2015 Hyundai Grand i10 Magna,Nov-15,Third Party,Petrol,5,87109,Second Owner,Manual,2015,1197,82,82,114,4.59
+1029,2019 Mahindra TUV 300 T10,Jun-19,Comprehensive,Diesel,7,69000,First Owner,Manual,2019,18.49,1493,1493,100,8.5
+1030,2017 Volkswagen Ameo 1.5 TDI Highline AT,Nov-17,Comprehensive,Diesel,5,109000,First Owner,Automatic,2017,22,1498,1498,108495,6.25
+1031,2018 Hyundai Elantra 1.6 SX Option AT,May-18,Comprehensive,Diesel,5,90001,First Owner,Automatic,2018,18.23,1582,1582,1262,10.75
+1032,2022 Skoda Kushaq 1.5 TSI Style DSG,Apr-22,Third Party,Petrol,5,13000,First Owner,Automatic,2022,18.89,1498,1498,14751,16.5
+1033,2011 Volkswagen Polo Diesel Comfortline 1.2L,Nov-11,Comprehensive,Diesel,5,60000,Second Owner,Manual,2011,22.07,1199,1199,739,2.4
+1034,2010 Hyundai Accent GLE,Nov-10,Comprehensive,Petrol,5,75000,First Owner,Manual,2010,1495,94,94,125,1.9
+1035,2019 Maruti XL6 Alpha AT,Nov-19,Comprehensive,Petrol,6,76000,First Owner,Automatic,2019,17.99,1462,1462,1032,9.25
+1036,2014 Maruti Ertiga VDI,Jun-14,Third Party insurance,Diesel,7,82000,First Owner,Manual,2014,20.77,1248,1248,8876,6.5
+1037,2016 Maruti Vitara Brezza ZDi Plus Dual Tone,May-16,Third Party insurance,Diesel,5,42261,First Owner,Manual,2016,24.3,1248,1248,885,8.85
+1038,2015 Hyundai Grand i10 Magna,Nov-15,Third Party,Petrol,5,87109,Second Owner,Manual,2015,1197,82,82,114,4.59
+1039,2014 Maruti Ertiga VDI,Jun-14,Third Party insurance,Diesel,7,82000,First Owner,Manual,2014,20.77,1248,1248,8876,6.5
+1040,2016 Hyundai EON Era Plus,May-16,Third Party insurance,Petrol,5,47057,First Owner,Manual,2016,814,552,552,745,3.17
+1041,2019 Hyundai Verna VTVT 1.6 SX,Jun-19,Zero Dep,Petrol,5,123715,First Owner,Manual,2019,17,1591,1591,1213,7.7
+1042,2018 Tata Tigor 1.2 Revotron XZ,2018,Third Party insurance,Petrol,5,60000,1199 cc,2018,Power Steering,1199,84,84,114,4.75
+1043,2021 Tata Tiago XT BSVI,Jan-21,Third Party,Petrol,5,36522,First Owner,Manual,2021,19.01,1199,1199,8482,5.44
+1044,2016 Volkswagen Vento 1.6 Highline,Jun-16,Third Party insurance,Petrol,5,63000,First Owner,Manual,2016,16.09,1598,1598,1032,5.8
+1045,2018 Volkswagen Polo 1.0 MPI Comfortline,Aug-18,Comprehensive,Petrol,5,23285,First Owner,Manual,2018,17.74,999,999,7510,5.73
+1046,2021 Hyundai Grand i10 Nios Sportz,Jun-21,Zero Dep,Petrol,5,14596,Second Owner,Manual,2021,20.7,1197,1197,8186,6.41
+1047,2013 Mercedes-Benz C-Class 220 CDI AT,Mar-13,Comprehensive,Diesel,5,48401,First Owner,Automatic,2013,14.84,2143,2143,170,12
+1048,2021 Maruti Baleno Zeta,Aug-21,Zero Dep,Petrol,5,34377,First Owner,Manual,2021,21.01,1197,1197,8180,7.57
+1049,2011 Mercedes-Benz M-Class ML 350 CDI,May-11,Third Party insurance,Diesel,5,127000,Third Owner,Automatic,2011,11.74,2987,2987,2548,11
+1050,2018 Mercedes-Benz E-Class Exclusive E 220 d BSIV,Nov-18,Comprehensive,Diesel,5,70000,First Owner,Automatic,2018,16.1,1950,1950,1917,39.95
+1051,2012 BMW X3 xDrive20d,2012,Third Party insurance,Diesel,5,90000,Second Owner,Automatic,2012,16.09,1995,1995,184,12
+1052,2017 Ford Ecosport 1.5 Diesel Titanium Plus,May-17,Comprehensive,Diesel,5,65000,First Owner,Manual,2017,21.7,1498,1498,9896,7.25
+1053,2020 Jeep Compass 2.0 Limited Plus,Jul-20,Comprehensive,Diesel,5,80000,First Owner,Manual,2020,17.1,1956,1956,17063,16.5
+1054,2014 Honda Mobilio S i-DTEC,Nov-14,Comprehensive,Diesel,7,89000,First Owner,Manual,2014,24.2,1498,1498,986,5.5
+1055,2018 Ford Ecosport 1.5 Diesel Titanium Plus,Oct-18,Comprehensive,Diesel,5,90000,First Owner,Manual,2018,21.7,1498,1498,9896,7.75
+1056,2017 Volkswagen Vento 1.5 TDI Highline AT,Nov-17,Comprehensive,Diesel,5,109000,First Owner,Automatic,2017,22.15,1498,1498,1086,7.25
+1057,2021 Mahindra XUV300 W8 AMT Optional Diesel BSVI,Jun-21,Zero Dep,Diesel,5,66302,First Owner,Automatic,2021,19.7,1497,1497,11505,11.24
+1058,2012 Maruti Swift Dzire VXI,Apr-12,Third Party insurance,Petrol,5,79247,First Owner,Manual,2012,22.41,1197,1197,8850,4.1
+1059,2017 Mini Cooper Clubman Cooper S,Feb-17,Comprehensive,Petrol,5,46000,First Owner,Automatic,2017,13.79,1998,1998,192,33
+1060,2017 Maruti Baleno 1.3 Alpha,Jan-18,Third Party,Diesel,5,82051,First Owner,Manual,2017,27.39,1248,1248,74,6.07
+1061,2021 Maruti Swift ZXI Plus,Jul-21,Third Party insurance,Petrol,5,31655,First Owner,Manual,2021,22.38,1197,1197,8850,7.75
+1062,2017 Hyundai Grand i10 Sportz,May-17,Comprehensive,Petrol,5,16000,First Owner,Manual,2017,18.9,1197,1197,8186,5.75
+1063,2019 Honda WR-V i-DTEC VX,Jul-19,Zero Dep,Diesel,5,59965,First Owner,Manual,2019,25.5,1498,1498,986,7.61
+1064,2009 Hyundai i20 Asta,Nov-09,Third Party insurance,Petrol,5,60000,Third Owner,Manual,2009,17,1197,1197,805200,1.75
+1065,2017 Maruti Baleno 1.2 Delta,May-17,Zero Dep,Petrol,5,103209,First Owner,Manual,2017,21.4,1197,1197,831,5.02
+1066,2017 Maruti Baleno 1.2 Delta,Jul-17,Third Party insurance,Petrol,5,29497,First Owner,Manual,2017,21.4,1197,1197,831,5.59
+1067,2012 Hyundai i10 Magna,Nov-12,Comprehensive,Petrol,5,51000,First Owner,Manual,2012,1197,789,789,1117,2.9
+1068,2020 Hyundai Grand i10 Nios AMT Sportz,Oct-20,Third Party,Petrol,5,22849,First Owner,Automatic,2020,20.7,1197,1197,8186,6.83
+1069,2018 Hyundai i20 1.4 Asta,Jun-18,Third Party insurance,Diesel,5,66000,First Owner,Manual,2018,22.54,1396,1396,8873,5.75
+1070,2019 BMW X1 xDrive 20d xLine,Sep-19,Third Party insurance,Diesel,5,43000,First Owner,Automatic,2019,20.68,1995,1995,190,29.5
+1071,2019 Maruti Vitara Brezza VDi,Dec-19,Comprehensive,Diesel,5,68000,First Owner,Manual,2019,24.3,1248,1248,885,7.5
+1072,2018 Mercedes-Benz GLC 220d 4MATIC Sport,Aug-18,Comprehensive,Diesel,5,61000,First Owner,Automatic,2018,17.9,2143,2143,170,37.5
+1073,2018 Maruti Ciaz Delta,Nov-18,Comprehensive,Petrol,5,35000,First Owner,Manual,2018,20.65,1462,1462,10325,6.8
+1074,2019 Maruti Baleno Zeta CVT,Nov-19,Comprehensive,Petrol,5,47000,First Owner,Automatic,2019,19.56,1197,1197,8180,6.75
+1075,2019 Maruti Vitara Brezza ZDi Plus,Apr-19,Third Party insurance,Diesel,5,54000,First Owner,Manual,2019,24.3,1248,1248,885,8.75
+1076,2015 Honda City i VTEC CVT SV,Jan-16,Zero Dep,Petrol,5,72000,First Owner,Automatic,2015,18,1497,1497,1173,6.15
+1077,2017 Maruti Alto 800 LXI,Jun-17,Third Party insurance,Petrol,5,62039,First Owner,Manual,2017,796,4733,4733,69,3.02
+1078,2020 Maruti Baleno Zeta,Dec-20,Comprehensive,Petrol,5,23428,First Owner,Manual,2020,21.01,1197,1197,8180,7.14
+1079,2017 Maruti SX4 S Cross Zeta DDiS 200 SH,Oct-17,Comprehensive,Diesel,5,53000,First Owner,Manual,2017,25.1,1248,1248,885,7.95
+1080,2012 Honda City V MT,Jul-12,Comprehensive,Petrol,5,47925,First Owner,Manual,2012,16.8,1497,1497,1163,4.53
+1081,2015 Hyundai Grand i10 Magna,Jul-15,Third Party insurance,Petrol,5,59011,First Owner,Manual,2015,1197,82,82,114,4.26
+1082,2019 Mahindra Alturas G4 4X2 AT,Jul-19,Comprehensive,Diesel,7,121281,First Owner,Automatic,2019,12.35,2157,2157,17849,17.51
+1083,2019 Hyundai Grand i10 1.2 Kappa Sportz BSIV,Jun-19,Third Party,Petrol,5,63238,First Owner,Manual,2019,18.9,1197,1197,8186,5.15
+1084,2014 Honda City i VTEC CVT VX,Jan-14,Third Party insurance,Petrol,5,51376,First Owner,Automatic,2014,18,1497,1497,1173,6
+1085,2013 Hyundai i10 Magna 1.1L,Jun-13,Comprehensive,Petrol,5,51196,First Owner,Manual,2013,1086,6805,6805,9904,3.19
+1086,2018 Hyundai Grand i10 1.2 Kappa Sportz Option AT,Sep-18,Third Party insurance,Petrol,5,35898,Second Owner,Automatic,2018,18.9,1197,1197,8186,5.43
+1087,2018 BMW 5 Series 520d Sport Line,May-18,Comprehensive,Diesel,5,40000,Second Owner,Automatic,2018,22.48,1995,1995,18774,34.5
+1088,2018 Maruti Ignis 1.2 Delta BSIV,Aug-18,Comprehensive,Petrol,5,19876,First Owner,Manual,2018,20.89,1197,1197,8180,4.92
+1089,2012 Maruti Swift VDI,Nov-12,Comprehensive,Diesel,5,68000,First Owner,Manual,2012,22.9,1248,1248,74,4.1
+1090,2016 Honda Amaze S Petrol,Jan-16,Comprehensive,Petrol,5,40451,First Owner,Manual,2016,18.6,1199,1199,8876,5.25
+1091,2014 Honda City i VTEC SV,Jul-14,Third Party insurance,Petrol,5,60000,Second Owner,Manual,2014,17.4,1497,1497,1173,5.55
+1092,2013 Audi A6 2.0 TDI Premium Plus,Jun-13,Comprehensive,Diesel,5,69000,First Owner,Automatic,2013,17.68,1968,1968,17433,14.5
+1093,2018 Maruti Baleno Zeta,Oct-18,Comprehensive,Petrol,5,98000,First Owner,Manual,2018,21.01,1197,1197,8180,6
+1094,2020 Hyundai Venue SX Plus Turbo DCT,Mar-20,Zero Dep,Petrol,5,790000,First Owner,Automatic,2020,18.15,998,998,11835,9.75
+1095,2019 Honda Jazz VX CVT,Apr-19,Zero Dep,Petrol,5,55000,First Owner,Automatic,2019,18.2,1199,1199,887,7.5
+1096,2015 Toyota Etios GD,Apr-15,Zero Dep,Diesel,5,104000,First Owner,Manual,2015,23.59,1364,1364,6705,5.25
+1097,2019 Maruti Alto 800 VXI BSIV,Nov-19,Zero Dep,Petrol,5,57647,First Owner,Manual,2019,24.7,796,796,473,3.52
+1098,2017 Hyundai Grand i10 1.2 Kappa Magna BSIV,Oct-17,Third Party insurance,Petrol,5,76125,Second Owner,Manual,2017,18.9,1197,1197,8186,4.4
+1099,2017 Maruti Swift Dzire VDI,Dec-17,Third Party,Diesel,5,94857,First Owner,Manual,2017,28.4,1248,1248,7402,6.06
+1100,2016 Honda Amaze S i-Vtech,Apr-16,Comprehensive,Petrol,5,51499,First Owner,Manual,2016,18,1198,1198,867,4.96
+1101,2023 Mahindra XUV700 AX5 7 Str Diesel AT,Feb-23,Comprehensive,Diesel,7,22468,First Owner,Automatic,2023,2198,18238,18238,450,22
+1102,2016 Maruti Celerio ZXI,Aug-16,Zero Dep,Petrol,5,123186,First Owner,Manual,2016,25.24,998,998,6571,3.68
+1103,2021 Maruti Wagon R VXI AMT,Aug-21,Comprehensive,Petrol,5,20000,First Owner,Automatic,2021,21.79,998,998,6705,6.1
+1104,2015 Hyundai i20 Asta 1.2,Jan-16,Zero Dep,Petrol,5,74661,First Owner,Manual,2015,18.6,1197,1197,8183,5.45
+1105,2012 Maruti Swift VDI,Jul-12,Comprehensive,Diesel,5,50018,First Owner,Manual,2012,22.9,1248,1248,74,4.2
+1106,2019 Hyundai i20 1.2 Asta,Nov-19,Third Party,Petrol,5,38000,First Owner,Manual,2019,18.6,1197,1197,8183,5.6
+1107,2021 Maruti Baleno Zeta,Jul-21,Zero Dep,Petrol,5,11971,First Owner,Manual,2021,21.01,1197,1197,8180,7.55
+1108,2010 Fiat Punto 1.3 Emotion,2010,Third Party insurance,Diesel,5,80000,Third Owner,Manual,2010,20.3,1248,1248,75,1
+1109,2014 Hyundai i20 Asta 1.2,May-14,Comprehensive,Petrol,5,64000,First Owner,Manual,2014,18.6,1197,1197,8183,5.5
+1110,2017 Maruti Baleno 1.2 Sigma,Nov-17,Comprehensive,Petrol,5,37000,First Owner,Manual,2017,1197,831,831,115,5.05
+1111,2015 Hyundai i20 Asta 1.4 CRDi,Nov-15,Comprehensive,Diesel,5,92000,First Owner,Manual,2015,22.54,1396,1396,8873,5.95
+1112,2019 Maruti Alto K10 VXI,Nov-19,Comprehensive,Petrol,5,70000,Second Owner,Manual,2019,23.95,998,998,6705,3.4
+1113,2021 Maruti Vitara Brezza LXI,Nov-21,Comprehensive,Petrol,5,83000,First Owner,Manual,2021,17.03,1462,1462,10326,7.95
+1114,2020 Maruti Wagon R LXI,Nov-20,Comprehensive,Petrol,5,32000,First Owner,Manual,2020,998,6705,6705,90,5.1
+1115,2018 Maruti Baleno Alpha Diesel,Nov-18,Comprehensive,Diesel,5,88000,Second Owner,Manual,2018,27.39,1248,1248,74,5.9
+1116,2012 Maruti Swift Dzire LXI,Nov-12,Third Party insurance,Petrol,5,105885,First Owner,Manual,2012,1197,8850,8850,113,3.27
+1117,2017 Honda WR-V i-DTEC VX,Jun-17,Zero Dep,Diesel,5,93774,First Owner,Manual,2017,25.5,1498,1498,986,7.15
+1118,2020 Mercedes-Benz C-Class Progressive C 220d,Jan-20,Third Party insurance,Diesel,5,44000,First Owner,Automatic,2020,12.6,1950,1950,194,39.5
+1119,2016 Hyundai Grand i10 Magna,Dec-16,Third Party,Petrol,5,86981,First Owner,Manual,2016,1197,82,82,114,4.21
+1120,2019 Maruti Baleno 1.2 Zeta,Jan-20,Zero Dep,Petrol,5,48728,First Owner,Manual,2019,21.4,1197,1197,831,6.66
+1121,2013 Hyundai Verna 1.6 SX VTVT,Nov-13,Comprehensive,Petrol,5,87001,First Owner,Manual,2013,17.01,1591,1591,1213,4.65
+1122,2016 Maruti Wagon R VXI BS IV,Apr-16,Third Party,Petrol,5,50595,First Owner,Manual,2016,20.51,998,998,6704,4.11
+1123,2021 Honda Jazz V CVT,Mar-21,Comprehensive,Petrol,5,31000,First Owner,Automatic,2021,17.1,1199,1199,8850,8.5
+1124,2015 Hyundai Grand i10 Magna,Sep-15,Third Party,Petrol,5,103012,First Owner,Manual,2015,1197,82,82,114,4.14
+1125,2013 Maruti Swift VXI,Jan-14,Third Party,Petrol,5,108929,First Owner,Manual,2013,22.38,1197,1197,8850,3.84
+1126,2016 Honda BR-V i-VTEC V CVT,Sep-16,Third Party insurance,Petrol,7,57000,First Owner,Automatic,2016,15.4,1497,1497,1173,7.95
+1127,2018 Honda Brio 1.2 S Option MT,Jul-18,Comprehensive,Petrol,5,56387,First Owner,Manual,2018,18.5,1198,1198,868,4.3
+1128,2014 Honda City i DTec VX,Nov-14,Comprehensive,Diesel,5,101000,First Owner,Manual,2014,26,1498,1498,986,5.75
+1129,2018 Honda Brio 1.2 VX AT,Feb-18,Comprehensive,Petrol,5,42000,First Owner,Automatic,2018,16.5,1198,1198,868,5.5
+1130,2021 Hyundai Verna SX Diesel,Jun-21,Third Party insurance,Diesel,5,50000,First Owner,Manual,2021,25,1493,1493,11345,13.9
+1131,2020 Ford Ecosport 1.5 Diesel Titanium,Oct-20,Comprehensive,Diesel,5,810000,First Owner,Manual,2020,21.7,1498,1498,9896,9
+1132,2018 Hyundai Grand i10 1.2 Kappa Sportz Option AT,Jan-19,Comprehensive,Petrol,5,26000,First Owner,Automatic,2018,18.9,1197,1197,8186,5.95
+1133,2014 Mercedes-Benz C-Class C 220 CDI BE Avantgare,Nov-14,Comprehensive,Diesel,5,92001,First Owner,Automatic,2014,14.84,2143,2143,16762,11.75
+1134,2016 Honda Brio 1.2 VX MT,Oct-16,Comprehensive,Petrol,5,29000,First Owner,Manual,2016,18.5,1198,1198,868,4.5
+1135,2017 Maruti Swift VXI Optional,Jan-17,Third Party insurance,Petrol,5,69000,First Owner,Manual,2017,20.4,1197,1197,8180,5.4
+1136,2022 Maruti Ignis Sigma BSVI,Jun-22,Zero Dep,Petrol,5,51918,First Owner,Manual,2022,1197,8180,8180,113,5.4
+1137,2016 Hyundai Grand i10 Asta,Jun-16,Third Party,Petrol,5,37552,First Owner,Manual,2016,18.9,1197,1197,82,5.32
+1138,2019 Tata Nexon 1.2 Revotron XZ Plus,Oct-19,Comprehensive,Petrol,5,84000,First Owner,Manual,2019,17,1198,1198,1085,8.7
+1139,2016 Honda Amaze S i-Vtech,Mar-16,Third Party,Petrol,5,63420,First Owner,Manual,2016,18,1198,1198,867,5.11
+1140,2017 Hyundai Grand i10 1.2 Kappa Magna BSIV,Jan-18,Third Party,Petrol,5,68888,Second Owner,Manual,2017,18.9,1197,1197,8186,4.39
+1141,2013 Maruti Swift ZDi,Nov-13,Comprehensive,Diesel,5,104255,First Owner,Manual,2013,22.9,1248,1248,74,4.5
+1142,2018 Honda Brio 1.2 S Option MT,Jul-18,Third Party,Petrol,5,47877,First Owner,Manual,2018,18.5,1198,1198,868,4.72
+1143,2016 Mercedes-Benz C-Class C 200 AVANTGARDE,Apr-16,Comprehensive,Petrol,5,61000,Second Owner,Automatic,2016,14.74,1991,1991,18104,27.9
+1144,2016 Honda Jazz 1.5 V i DTEC,Oct-16,Third Party insurance,Diesel,5,83337,First Owner,Manual,2016,27.3,1498,1498,986,4.64
+1145,2016 Honda Brio S MT,Dec-16,Third Party,Petrol,5,61836,First Owner,Manual,2016,19.4,1198,1198,868,4.06
+1146,2015 Volkswagen Vento 1.2 TSI Highline AT,Nov-15,Comprehensive,Petrol,5,68001,First Owner,Automatic,2015,18.19,1197,1197,1032,5.9
+1147,2022 Maruti Baleno Zeta BSVI,Feb-23,Zero Dep,Petrol,5,39813,First Owner,Manual,2022,22.35,1197,1197,8850,7.87
+1148,2018 Honda Amaze VX i-VTEC,Oct-18,Comprehensive,Petrol,5,74000,First Owner,Manual,2018,17.8,1198,1198,867,6.9
+1149,2013 Honda Brio V MT,Oct-13,Comprehensive,Petrol,5,87000,First Owner,Manual,2013,19.4,1198,1198,868,3.5
+1150,2016 Hyundai i20 Sportz Option 1.2,Aug-16,Third Party insurance,Petrol,5,71000,First Owner,Manual,2016,18.6,1197,1197,8183,6.6
+1151,2018 Mercedes-Benz GLE 250d,Oct-18,Comprehensive,Diesel,5,102000,First Owner,Automatic,2018,17.9,2143,2143,20115,43.5
+1152,2010 Mitsubishi Outlander 2.4,2010,Third Party insurance,Petrol,5,110000,Third Owner,Automatic,2010,11.3,2360,2360,170,6.5
+1153,2019 Tata Tiago 1.2 Revotron XZ Plus,Oct-19,Comprehensive,Petrol,5,75000,First Owner,Manual,2019,23.84,1199,1199,84,5.7
+1154,2017 Maruti Ciaz VDi Plus SHVS,Jan-17,Third Party insurance,Diesel,5,62000,First Owner,Manual,2017,28.09,1248,1248,885,7.1
+1155,2014 Hyundai i10 Magna 1.2 iTech SE,May-14,Third Party insurance,Petrol,5,49000,First Owner,Manual,2014,1197,789,789,1117,4.4
+1156,2016 Maruti Ciaz ZXi,Apr-17,Comprehensive,Petrol,5,76792,First Owner,Manual,2016,20.73,1373,1373,911,6.37
+1157,2014 Honda Brio S MT,Jul-14,Comprehensive,Petrol,5,34445,First Owner,Manual,2014,19.4,1198,1198,868,4.24
+1158,2012 Hyundai i10 Magna 1.1 iTech SE,Apr-12,Comprehensive,Petrol,5,64000,First Owner,Manual,2012,1086,6805,6805,9904,3.2
+1159,2016 Maruti Swift Dzire VXI,Jul-16,Third Party,Petrol,5,109405,First Owner,Manual,2016,22.41,1197,1197,8850,5.2
+1160,2015 Honda Jazz 1.2 VX i VTEC,Oct-15,Comprehensive,Petrol,5,118146,First Owner,Manual,2015,18.7,1199,1199,887,4.61
+1161,2022 Tata Punch Creative AMT BSVI,Aug-22,Comprehensive,Petrol,5,9000,First Owner,Automatic,2022,18.8,1199,1199,8663,8.75
+1162,2017 Hyundai Grand i10 1.2 Kappa Sportz Option AT,Aug-17,Zero Dep,Petrol,5,41339,Second Owner,Automatic,2017,18.9,1197,1197,8186,5.87
+1163,2022 BMW 2 Series 220i M Sport BSVI,Sep-22,Comprehensive,Petrol,5,22000,Second Owner,Automatic,2022,14.82,1998,1998,18908,33.5
+1164,2017 Honda WR-V i-VTEC VX,Jan-18,Comprehensive,Petrol,5,62607,First Owner,Manual,2017,17.5,1199,1199,887,7.21
+1165,2020 Maruti Baleno Delta,Mar-20,Zero Dep,Petrol,5,52794,First Owner,Manual,2020,21.01,1197,1197,8180,6.77
+1166,2022 Mercedes-Benz E-Class Exclusive E 200 BSVI,Nov-22,Comprehensive,Petrol,5,10000,First Owner,Automatic,2022,15,1991,1991,19444,67.5
+1167,2022 Renault Triber RXL BSVI,Jun-22,Third Party,Petrol,7,33864,First Owner,Manual,2022,20,999,999,7101,5.86
+1168,2012 Hyundai Elantra CRDi SX AT,Oct-12,Third Party insurance,Diesel,5,73000,Second Owner,Automatic,2012,19.5,1582,1582,12624,4.25
+1169,2017 Maruti Baleno Delta,Nov-17,Third Party,Petrol,5,70000,First Owner,Manual,2017,21.01,1197,1197,8180,4.75
+1170,2017 Honda BR-V i-DTEC S MT,Jun-17,Comprehensive,Diesel,7,67754,Second Owner,Manual,2017,21.9,1498,1498,986,6.15
+1171,2011 Maruti Wagon R LX Minor,2011,Third Party insurance,Petrol,5,60000,998 cc,2011,Power Steering,998,671,671,90,1.7
+1172,2010 Nissan Micra XL,Nov-10,Comprehensive,Petrol,5,69000,First Owner,Manual,2010,18.06,1198,1198,75,2.5
+1173,2018 Mahindra XUV500 W7 BSIV,Jan-19,Third Party insurance,Diesel,7,78000,First Owner,Manual,2018,15.1,2179,2179,15287,10.25
+1174,2009 Maruti Alto 800 LXi BSIII,2009,Third Party insurance,Petrol,5,70000,Third Owner,Manual,2009,796,463,463,62,1.4
+1175,2017 Maruti Ertiga SHVS VDI,Jun-17,Third Party insurance,Diesel,7,83000,First Owner,Manual,2017,24.52,1248,1248,885,7.8
+1176,2020 Hyundai Grand i10 Nios AMT Sportz,Aug-20,Comprehensive,Petrol,5,17778,First Owner,Automatic,2020,20.7,1197,1197,8186,7.04
+1177,2021 Hyundai Grand i10 Nios AMT Sportz,Sep-21,Third Party,Petrol,5,16499,First Owner,Automatic,2021,20.7,1197,1197,8186,7.14
+1178,2012 Renault Scala Diesel RxZ,2012,Third Party insurance,Diesel,5,120000,First Owner,Manual,2012,21.64,1461,1461,848,2.25
+1179,2016 Honda Jazz 1.2 V i VTEC,Feb-16,Comprehensive,Petrol,5,33364,First Owner,Manual,2016,18.7,1199,1199,887,4.79
+1180,2016 Hyundai Grand i10 Sportz,May-16,Comprehensive,Petrol,5,64784,First Owner,Manual,2016,18.9,1197,1197,82,4.26
+1181,2014 Mercedes-Benz E-Class E 200 CGI,Nov-14,Comprehensive,Petrol,5,59000,First Owner,Automatic,2014,12,1991,1991,184,19.9
+1182,2014 Hyundai i10 Magna 1.1L,Nov-14,Third Party,Petrol,5,29584,First Owner,Manual,2014,1086,6805,6805,9904,3.7
+1183,2013 Nissan Sunny Petrol Special Edition,2013,Third Party insurance,Petrol,5,80000,Third Owner,Manual,2013,16.95,1498,1498,977,3
+1184,2011 Honda City 1.5 S MT,Apr-11,Third Party,Petrol,5,87217,First Owner,Manual,2011,17,1497,1497,1186600,3.73
+1185,2017 Tata Tiago 1.2 Revotron XT,Feb-18,Third Party,Petrol,5,77482,Second Owner,Manual,2017,23.84,1199,1199,84,3.99
+1186,2018 Honda Jazz 1.2 V AT i VTEC,Oct-18,Comprehensive,Petrol,5,60000,First Owner,Automatic,2018,19,1199,1199,887,6.25
+1187,2020 Tata Tiago XZ,Nov-20,Third Party insurance,Petrol,5,34312,First Owner,Manual,2020,20.09,1199,1199,8482,5.57
+1188,2021 Tata Tiago XZA Plus AMT BSVI,Aug-21,Third Party,Petrol,5,53000,First Owner,Automatic,2021,19,1199,1199,8482,6.5
+1189,2017 Honda Amaze VX CVT i-VTEC,Oct-17,Comprehensive,Petrol,5,45000,First Owner,Automatic,2017,18.1,1199,1199,887,5.75
+1190,2019 Honda Amaze VX i-VTEC,Oct-19,Comprehensive,Petrol,5,23000,First Owner,Manual,2019,17.8,1198,1198,867,6.9
+1191,2015 Maruti Swift Dzire VXI 1.2,Nov-15,Comprehensive,Petrol,5,80001,First Owner,Manual,2015,21.21,1197,1197,8180,4.9
+1192,2015 Maruti Swift Dzire VDI,Nov-15,Comprehensive,Diesel,5,62000,First Owner,Manual,2015,28.4,1248,1248,7402,5.5
+1193,2020 Ford Ecosport 1.5 Petrol Titanium Plus AT BSIV,Jul-20,Third Party insurance,Petrol,5,57000,First Owner,Automatic,2020,14.8,1497,1497,12136,8.5
+1194,2015 Honda Brio S MT,Dec-15,Comprehensive,Petrol,5,21000,First Owner,Manual,2015,19.4,1198,1198,868,3.9
+1195,2013 Maruti Swift VXI,May-13,Third Party,Petrol,5,43415,First Owner,Manual,2013,22.38,1197,1197,8850,4.08
+1196,2017 Hyundai i20 Asta Option 1.4 CRDi,Jul-17,Third Party,Diesel,5,24412,First Owner,Manual,2017,22.54,1396,1396,8873,7.58
+1197,2021 Kia Carnival Premium,Sep-21,Zero Dep,Diesel,7,45000,First Owner,Automatic,2021,14.11,2199,2199,1972,25.9
+1198,2015 Hyundai Grand i10 Magna,Mar-15,Third Party,Petrol,5,24020,First Owner,Manual,2015,1197,82,82,114,4.8
+1199,2018 Maruti Swift Dzire VXI 1.2,Dec-18,Third Party insurance,Petrol,5,70251,Second Owner,Manual,2018,21.21,1197,1197,8180,5.33
+1200,2018 Honda City VX CVT,Jul-18,Comprehensive,Petrol,5,44000,First Owner,Automatic,2018,18.4,1498,1498,11935,9.9
+1201,2021 Maruti Alto 800 LXI S-CNG,Apr-21,Comprehensive,CNG,4,86212,First Owner,Manual,2021,796,4036,4036,60,4.2
+1202,2018 Hyundai Verna VTVT 1.6 AT SX Option,Dec-18,Third Party insurance,Petrol,5,64000,First Owner,Automatic,2018,17,1591,1591,1213,9.5
+1203,2015 Hyundai Grand i10 Magna,Jul-15,Third Party insurance,Petrol,5,39458,First Owner,Manual,2015,1197,82,82,114,4.65
+1204,2012 Maruti Swift VDI,May-13,Third Party insurance,Diesel,5,70598,First Owner,Manual,2012,22.9,1248,1248,74,3.56
+1205,2017 Honda Amaze S Option i-VTEC,Oct-17,Comprehensive,Petrol,5,94000,First Owner,Manual,2017,17.8,1198,1198,867,4.75
+1206,2016 Hyundai Grand i10 Magna,Aug-16,Third Party insurance,Petrol,5,48325,First Owner,Manual,2016,1197,82,82,114,4.3
+1207,2016 Toyota Corolla Altis VL AT,Nov-16,Comprehensive,Petrol,5,66000,Second Owner,Automatic,2016,14.28,1798,1798,13803,6.5
+1208,2015 Honda City i DTEC V,Nov-15,Comprehensive,Diesel,5,86001,First Owner,Manual,2015,26,1498,1498,986,5.75
+1209,2014 Toyota Corolla Altis G AT,Nov-14,Comprehensive,Petrol,5,62000,First Owner,Automatic,2014,14.28,1798,1798,13803,6.9
+1210,2016 Hyundai Verna 1.4 VTVT,Nov-16,Comprehensive,Petrol,5,50000,First Owner,Manual,2016,17.43,1396,1396,1055,6.25
+1211,2016 Hyundai Creta 1.6 SX Diesel,Oct-16,Comprehensive,Diesel,5,79000,First Owner,Manual,2016,20.5,1582,1582,1262,9.25
+1212,2017 Maruti Swift Dzire AMT ZDI Plus,Nov-17,Comprehensive,Diesel,5,74002,First Owner,Automatic,2017,28.4,1248,1248,7402,6.75
+1213,2014 Mercedes-Benz S-Class S 500 L,Nov-14,Comprehensive,Petrol,5,74000,First Owner,Automatic,2014,7.81,5461,5461,3629,52.9
+1214,2015 Hyundai Verna 1.6 CRDi S Option,Oct-15,Third Party,Diesel,5,65000,Second Owner,Manual,2015,23.9,1582,1582,12632,5.9
+1215,2021 Hyundai i20 Asta Opt BSVI,Oct-21,Comprehensive,Petrol,5,39718,Second Owner,Manual,2021,21,1197,1197,8180,7.58
+1216,2016 Hyundai Grand i10 Magna,Jan-17,Third Party,Petrol,5,67529,First Owner,Manual,2016,1197,82,82,114,4.5
+1217,2016 Audi Q7 45 TDI Quattro Technology,2016,Third Party insurance,Diesel,7,110000,Second Owner,Automatic,2016,14.75,2967,2967,245,40
+1218,2017 Maruti Baleno 1.2 Delta,Oct-17,Third Party insurance,Petrol,5,88281,First Owner,Manual,2017,21.4,1197,1197,831,5.01
+1219,2016 Hyundai Grand i10 Magna,May-16,Third Party,Petrol,5,64160,Second Owner,Manual,2016,1197,82,82,114,4.12
+1220,2018 Hyundai Tucson 2.0 e-VGT 4WD AT GLS,Oct-18,Comprehensive,Diesel,5,88000,First Owner,Automatic,2018,16.38,1995,1995,18246,15.5
+1221,2017 Maruti Swift VXI,Jun-17,Zero Dep,Petrol,5,77253,First Owner,Manual,2017,22.38,1197,1197,8850,4.91
+1222,2013 Audi A4 2.0 TDI,Oct-13,Comprehensive,Diesel,5,72000,First Owner,Automatic,2013,16.55,1968,1968,14751,11.9
+1223,2012 Honda City S,Dec-12,Comprehensive,Petrol,5,102614,First Owner,Manual,2012,16.8,1497,1497,1164,4.01
+1224,2017 Honda City i VTEC SV,Oct-17,Comprehensive,Petrol,5,78911,Second Owner,Manual,2017,17.8,1497,1497,1173,6.37
+1225,2015 BMW X5 xDrive 30d,Aug-15,Comprehensive,Diesel,5,99000,First Owner,Automatic,2015,15.3,2993,2993,258,28.9
+1226,2017 Hyundai Grand i10 1.2 Kappa Sportz BSIV,May-17,Third Party,Petrol,5,47975,Second Owner,Manual,2017,18.9,1197,1197,8186,4.96
+1227,2018 Mercedes-Benz C-Class C 220d Avantgarde Edition C,Oct-18,Comprehensive,Diesel,5,56000,First Owner,Automatic,2018,19.27,2143,2143,16762,29.5
+1228,2014 Mercedes-Benz GL-Class 350 CDI Blue Efficiency,2014,Third Party insurance,Diesel,7,121000,First Owner,Automatic,2014,11.3,2987,2987,2548,35
+1229,2015 Mercedes-Benz M-Class ML 250 CDI,Mar-15,Comprehensive,Diesel,5,78000,First Owner,Automatic,2015,15.26,2143,2143,2032,23.9
+1230,2015 BMW X6 xDrive 40d M Sport,Jun-15,Comprehensive,Diesel,5,75000,Second Owner,Automatic,2015,15.87,2993,2993,30843,32.9
+1231,2020 Land Rover Range Rover Evoque 2.0 R-Dynamic SE diesel 2020-2021,Oct-20,Comprehensive,Diesel,5,44000,First Owner,Automatic,2020,1999,2454,2454,430,53.5
+1232,2019 Maruti Celerio ZXI AMT BSIV,Mar-19,Comprehensive,Petrol,5,42000,First Owner,Automatic,2019,23.1,998,998,6704,4.5
+1233,2017 Maruti Ciaz 1.3 Alpha,2017,Third Party insurance,Diesel,5,32141,1248 cc,2017,Power Steering,1248,885,885,200,6
+1234,2018 Maruti Baleno 1.2 CVT Alpha,2018,Third Party insurance,Petrol,5,60000,Third Owner,Automatic,2018,21.4,1197,1197,831,5.1
+1235,2015 Hyundai Grand i10 Magna,Aug-15,Third Party insurance,Petrol,5,64657,First Owner,Manual,2015,1197,82,82,114,4.02
+1236,2018 Honda Jazz 1.2 V AT i VTEC,May-18,Comprehensive,Petrol,5,100657,First Owner,Automatic,2018,19,1199,1199,887,5.67
+1237,2018 Hyundai Creta 1.6 VTVT AT SX Plus,Jun-18,Comprehensive,Petrol,5,32000,First Owner,Automatic,2018,13,1591,1591,1213,10.9
+1238,2012 Honda Brio S MT,Sep-12,Third Party,Petrol,5,50570,First Owner,Manual,2012,19.4,1198,1198,868,2.8
+1239,2016 Hyundai Grand i10 Asta,Mar-16,Third Party,Petrol,5,42392,First Owner,Manual,2016,18.9,1197,1197,82,5.13
+1240,2014 Ford Ecosport 1.5 DV5 MT Titanium,Aug-14,Third Party insurance,Diesel,5,78000,Second Owner,Manual,2014,22.7,1498,1498,8984,3.75
+1241,2015 Hyundai Grand i10 Magna,Mar-16,Third Party,Petrol,5,62155,First Owner,Manual,2015,1197,82,82,114,4.19
+1242,2007 Maruti SX4 Vxi BSIII,2007,Third Party insurance,Petrol,5,100000,Second Owner,Manual,2007,15,1586,1586,10468,1.55
+1243,2016 Hyundai i20 Asta Option 1.4 CRDi,Mar-16,Comprehensive,Diesel,5,94822,Third Owner,Manual,2016,22.54,1396,1396,8873,5.43
+1244,2016 Hyundai EON Era Plus,Dec-16,Third Party insurance,Petrol,5,59422,First Owner,Manual,2016,814,552,552,745,2.91
+1245,2020 Kia Seltos HTX IVT,Oct-20,Comprehensive,Petrol,5,82000,First Owner,Automatic,2020,1497,11343,11343,144,13.9
+1246,2017 Hyundai Verna VTVT 1.6 AT SX Option,Feb-18,Third Party,Petrol,5,70727,Second Owner,Automatic,2017,17,1591,1591,1213,9.12
+1247,2020 Kia Seltos HTX IVT,Oct-20,Comprehensive,Petrol,5,79000,First Owner,Automatic,2020,1497,11343,11343,144,12.9
+1248,2014 Renault Duster 110PS Diesel RxL,2014,Third Party insurance,Diesel,5,120000,Second Owner,Manual,2014,19.01,1461,1461,10845,3.45
+1249,2012 Renault Scala Diesel RxZ,2012,Third Party insurance,Diesel,5,120000,First Owner,Manual,2012,21.64,1461,1461,848,2.25
+1250,2013 Hyundai Elantra CRDi Base,2013,Third Party insurance,Diesel,5,120000,Third Owner,Manual,2013,22.7,1582,1582,12624,4
+1251,2016 Mahindra TUV 300 T8 AMT,Nov-16,Comprehensive,Diesel,7,70000,First Owner,Automatic,2016,18.49,1493,1493,100,6.15
+1252,2017 BMW X1 sDrive20d Expedition,Aug-17,Comprehensive,Diesel,5,61000,First Owner,Automatic,2017,20.68,1995,1995,188,19.75
+1253,2014 Honda Amaze EX i-Vtech,Nov-14,Comprehensive,Petrol,5,92000,First Owner,Manual,2014,18,1198,1198,867,3.6
+1254,2016 Honda BR-V i-VTEC S MT,Jan-16,Third Party insurance,Petrol,7,58857,First Owner,Manual,2016,15.4,1497,1497,1173,6.5
+1255,2016 Maruti Wagon R VXI BS IV,Jun-16,Comprehensive,Petrol,5,68237,First Owner,Manual,2016,20.51,998,998,6704,3.89
+1256,2021 Maruti Baleno Zeta,Jul-21,Zero Dep,Petrol,5,31237,First Owner,Manual,2021,21.01,1197,1197,8180,7.27
+1257,2017 Hyundai Xcent 1.2 VTVT E Plus,Dec-17,Third Party insurance,Petrol,5,45000,First Owner,Manual,2017,20.14,1197,1197,8186,4.95
+1258,2012 Maruti Swift VDI,Jun-12,Third Party,Diesel,5,93027,First Owner,Manual,2012,22.9,1248,1248,74,3.71
+1259,2014 Maruti Swift Dzire VDI,Jun-14,Third Party,Diesel,5,122688,Second Owner,Manual,2014,23.4,1248,1248,74,4.22
+1260,2020 Honda Amaze S i-DTEC,Nov-20,Comprehensive,Diesel,5,53000,First Owner,Manual,2020,25.8,1498,1498,986,6.75
+1261,2019 Maruti Celerio X ZXI,Mar-19,Zero Dep,Petrol,5,60464,First Owner,Manual,2019,21.63,998,998,6705,4.6
+1262,2023 Nissan Magnite XV Premium,2023,Third Party insurance,Petrol,5,10000,999 cc,2023,Power Steering,999,7102,7102,96,8.5
+1263,2014 Honda City i VTEC SV,Apr-14,Third Party,Petrol,5,40171,First Owner,Manual,2014,17.4,1497,1497,1173,5.17
+1264,2018 Honda Amaze S i-VTEC,Feb-19,Third Party,Petrol,5,122223,First Owner,Manual,2018,17.8,1198,1198,867,5.8
+1265,2010 Hyundai i10 Magna 1.1,Aug-10,Third Party insurance,Petrol,5,44000,First Owner,Manual,2010,1086,6805,6805,9904,2.4
+1266,2015 Hyundai Grand i10 AT Asta,Nov-15,Third Party,Petrol,5,77299,Second Owner,Automatic,2015,18.9,1197,1197,82,4.79
+1267,2019 Tata Harrier XT Plus,Oct-19,Comprehensive,Diesel,5,39000,First Owner,Manual,2019,16.35,1956,1956,16767,13.95
+1268,2018 Jeep Compass 2.0 Limited,2018,Third Party insurance,Diesel,5,120000,Second Owner,Manual,2018,17.1,1956,1956,170,11
+1269,2022 MG Astor Sharp EX BSVI,Sep-22,Zero Dep,Petrol,5,29000,First Owner,Manual,2022,15.43,1498,1498,10849,12.9
+1270,2017 Honda Jazz 1.2 S i VTEC,Jun-17,Comprehensive,Petrol,5,60000,First Owner,Manual,2017,18.7,1199,1199,887,4.75
+1271,2017 Hyundai i20 1.4 Asta,Nov-17,Comprehensive,Diesel,5,80000,First Owner,Manual,2017,22.54,1396,1396,8873,6.9
+1272,2015 Ford Ecosport 1.5 Diesel Titanium,Oct-15,Comprehensive,Diesel,5,78000,First Owner,Manual,2015,21.7,1498,1498,9896,5.5
+1273,2016 Honda Amaze S Diesel,Feb-16,Comprehensive,Diesel,5,58000,First Owner,Manual,2016,24.7,1498,1498,9789,5.5
+1274,2015 Hyundai Grand i10 CRDi Magna,Nov-15,Third Party insurance,Diesel,5,67000,First Owner,Manual,2015,1120,70,70,160,4.25
+1275,2014 Maruti Swift LXI,May-14,Comprehensive,Petrol,5,44019,Second Owner,Manual,2014,18.6,1197,1197,858,3.15
+1276,2021 Maruti Celerio ZXI Plus BSVI,Dec-21,Comprehensive,Petrol,5,11962,First Owner,Manual,2021,24.97,998,998,6571,5.69
+1277,2009 Maruti Alto 800 LXi,May-09,Comprehensive,Petrol,5,44002,Third Owner,Manual,2009,19.7,796,796,463,95000
+1278,2020 Maruti Alto 800 VXI BSVI,Oct-20,Comprehensive,Petrol,5,13066,First Owner,Manual,2020,22.05,796,796,4733,3.69
+1279,2016 Hyundai Grand i10 Sportz,Oct-16,Comprehensive,Petrol,5,36015,First Owner,Manual,2016,18.9,1197,1197,82,3.61
+1280,2021 Hyundai i20 Sportz IVT BSVI,Nov-21,Third Party insurance,Petrol,5,14000,Second Owner,Automatic,2021,19.65,1197,1197,8676,6.99
+1281,2020 Maruti Wagon R CNG LXI,Nov-20,Comprehensive,CNG,5,11880,First Owner,Manual,2020,998,5833,5833,78,4.74
+1282,2009 Hyundai i10 Era,Jan-09,Comprehensive,Petrol,5,35000,Second Owner,Manual,2009,1086,6805,6805,9904,2.25
+1283,2015 Maruti Ertiga LDI,Feb-15,Comprehensive,Diesel,7,65018,First Owner,Manual,2015,1248,8850,8850,200,4.75
+1284,2020 Maruti Alto 800 VXI BSVI,Nov-20,Comprehensive,Petrol,5,28061,First Owner,Manual,2020,22.05,796,796,4733,3.43
+1285,2019 Renault Duster RXS Option CVT BSIV,Dec-19,Third Party insurance,Petrol,5,40300,First Owner,Automatic,2019,13.9,1498,1498,105,6.5
+1286,2019 Maruti Alto K10 VXI,May-19,Comprehensive,Petrol,5,58231,First Owner,Manual,2019,23.95,998,998,6705,3.32
+1287,2017 Hyundai Grand i10 1.2 Kappa Sportz Dual Tone,2017,Third Party insurance,Petrol,5,70000,1197 cc,2017,Power Steering,1197,8186,8186,11375,4
+1288,2021 Hyundai i20 Asta Opt Turbo DCT BSVI,Jul-21,Third Party insurance,Petrol,5,13000,First Owner,Automatic,2021,20.28,998,998,11841,8.9
+1289,2020 Maruti Alto 800 VXI BSVI,Dec-20,Comprehensive,Petrol,5,32997,First Owner,Manual,2020,22.05,796,796,4733,3.39
+1290,2015 Honda Jazz 1.2 VX i VTEC,Aug-15,Comprehensive,Petrol,5,41203,First Owner,Manual,2015,18.7,1199,1199,887,3.99
+1291,2015 Volkswagen Vento 1.5 TDI Highline,2015,Third Party insurance,Diesel,5,90000,1498 cc,2015,Power Steering,1498,1032,1032,250,3.5
+1292,2019 Ford Aspire Titanium Plus BSIV,Jul-19,Comprehensive,Petrol,5,6818,First Owner,Manual,2019,19.4,1194,1194,9493,5.4
+1293,2016 Honda City i DTec SV,Jan-16,Comprehensive,Diesel,5,44000,First Owner,Manual,2016,26,1498,1498,986,5.5
+1294,2019 Honda City i-DTEC ZX,Mar-19,Third Party insurance,Diesel,5,29200,First Owner,Manual,2019,25.6,1498,1498,979,8.75
+1295,2011 Hyundai i10 Magna 1.1L,Apr-11,Comprehensive,Petrol,5,16016,First Owner,Manual,2011,1086,6805,6805,9904,1.85
+1296,2020 Maruti S-Presso VXI Plus 2019-2022,Sep-20,Comprehensive,Petrol,5,26638,First Owner,Manual,2020,21.7,998,998,6571,4.19
+1297,2016 Honda City i DTec SV,Jan-16,Comprehensive,Diesel,5,44000,First Owner,Manual,2016,26,1498,1498,986,5.5
+1298,2020 Maruti Wagon R CNG LXI,Feb-20,Comprehensive,CNG,5,18930,First Owner,Manual,2020,998,5833,5833,78,4.79
+1299,2019 Porsche Cayenne Base,Apr-19,Third Party insurance,Petrol,5,5700,First Owner,Automatic,2019,2995,340,340,450,1.05
+1300,2019 Honda City i-DTEC ZX,Mar-19,Third Party insurance,Diesel,5,29200,First Owner,Manual,2019,25.6,1498,1498,979,8.75
+1301,2019 Maruti Wagon R CNG LXI,Jun-19,Comprehensive,CNG,5,26580,First Owner,Manual,2019,998,5833,5833,78,4.49
+1302,2018 Honda BR-V i-VTEC V MT,Feb-18,Comprehensive,Petrol,7,35000,First Owner,Manual,2018,15.4,1497,1497,1173,7.45
+1303,2018 Audi Q3 30 TFSI Premium FWD,Jun-18,Comprehensive,Petrol,5,32000,First Owner,Automatic,2018,16.9,1395,1395,14751,21
+1304,2019 Hyundai Creta 1.6 SX Automatic Diesel,Apr-19,Comprehensive,Diesel,5,68499,First Owner,Automatic,2019,17.6,1582,1582,1262,10.83
+1305,2018 Ford Ecosport 1.5 Diesel Titanium BSIV,May-18,Comprehensive,Diesel,5,53750,First Owner,Manual,2018,23,1498,1498,9896,6.85
+1306,2019 Maruti Alto 800 VXI BSVI,May-19,Comprehensive,Petrol,5,48341,First Owner,Manual,2019,22.05,796,796,4733,3.03
+1307,2018 Lamborghini Urus V8,Sep-18,Third Party insurance,Petrol,5,25000,First Owner,Automatic,2018,3996,641,641,850,3.6
+1308,2018 Maruti Wagon R VXI 1.2 BSIV,Feb-18,Comprehensive,Petrol,5,34260,First Owner,Manual,2018,21.5,1197,1197,8180,3.95
+1309,2018 Ford Ecosport 1.5 Diesel Trend BSIV,Dec-18,Comprehensive,Diesel,5,48380,Second Owner,Manual,2018,23,1498,1498,9896,5.83
+1310,2018 Hyundai Creta 1.6 CRDi SX Plus,Nov-18,Third Party insurance,Diesel,5,52000,First Owner,Manual,2018,19.67,1582,1582,1262,9.95
+1311,2016 Maruti Omni E MPI STD,Mar-16,Comprehensive,Petrol,8,23022,Second Owner,Manual,2016,796,342,342,59,2.25
+1312,2019 Maruti Alto K10 VXI Optional,Jun-19,Comprehensive,Petrol,5,26610,First Owner,Manual,2019,23.95,998,998,6705,3.65
+1313,2018 Maruti Ertiga 1.5 VDI,Apr-18,Comprehensive,Diesel,7,66019,First Owner,Manual,2018,24.2,1498,1498,9387,7.75
+1314,2014 Maruti Alto K10 2010-2014 VXI,Aug-14,Comprehensive,Petrol,5,42320,First Owner,Manual,2014,998,671,671,90,2.29
+1315,2020 Maruti Wagon R CNG LXI,Feb-20,Comprehensive,CNG,5,25484,First Owner,Manual,2020,998,5833,5833,78,4.77
+1316,2013 Maruti Zen Estilo LXI,Apr-15,Comprehensive,Petrol,5,25171,First Owner,Manual,2013,998,671,671,90,2.22
+1317,2011 Hyundai i20 1.4 CRDi Asta,May-11,Comprehensive,Diesel,5,78006,Second Owner,Manual,2011,23,1396,1396,904000,2.55
+1318,2018 Nissan Micra XL CVT,Jan-19,Comprehensive,Petrol,5,21607,First Owner,Automatic,2018,19.34,1198,1198,7594,4.7
+1319,2019 Kia Seltos GTX Plus DCT,Nov-19,Comprehensive,Petrol,5,52162,First Owner,Automatic,2019,16.5,1353,1353,13808,11.92
+1320,2016 BMW 7 Series 730Ld Design Pure Excellence,Nov-16,Comprehensive,Diesel,5,23435,First Owner,Automatic,2016,16.77,2993,2993,26149,45
+1321,2021 Skoda Kushaq 1.0 TSI Style BSVI,Nov-21,Comprehensive,Petrol,5,20336,First Owner,Manual,2021,19.2,999,999,11398,12.81
+1322,2018 Maruti SX4 S Cross Alpha DDiS 200 SH,Jun-18,Comprehensive,Diesel,5,68591,First Owner,Manual,2018,25.1,1248,1248,885,6.75
+1323,2014 Maruti Swift VDI BSIV,Oct-14,Comprehensive,Diesel,5,65341,First Owner,Manual,2014,25.2,1248,1248,74,3.44
+1324,2017 Datsun RediGO 1.0 T Option,Nov-17,Comprehensive,Petrol,5,23329,First Owner,Manual,2017,22.5,999,999,67,2.72
+1325,2015 Honda City i DTEC VX,Nov-15,Comprehensive,Diesel,5,84000,First Owner,Manual,2015,25.1,1498,1498,986,5.25
+1326,2018 Toyota Corolla Altis 1.4 DG,Feb-18,Comprehensive,Diesel,5,19000,First Owner,Manual,2018,21.43,1364,1364,8679,14.95
+1327,2013 Maruti Ritz LDi,Oct-13,Comprehensive,Diesel,5,100500,Third Owner,Manual,2013,1248,7394,7394,190,2.45
+1328,2019 Ford Ecosport 1.5 Diesel Titanium BSIV,Jan-19,Third Party insurance,Diesel,5,58500,First Owner,Manual,2019,23,1498,1498,9896,6.65
+1329,2018 Volvo S60 Cross Country D4 AWD BSIV,May-18,Comprehensive,Diesel,5,66455,First Owner,Automatic,2018,19.6,2400,2400,190,19.35
+1330,2023 Maruti Celerio ZXI Plus,Mar-23,Comprehensive,Petrol,5,1229,First Owner,Manual,2023,24.97,998,998,6571,5.9
+1331,2022 Audi Q5 Premium plus BSVI,Sep-22,Third Party insurance,Petrol,5,12100,First Owner,Automatic,2022,245.59,370,370,19,50
+1332,2021 Kia Sonet HTX Turbo DCT,Feb-21,Comprehensive,Petrol,5,26597,First Owner,Automatic,2021,18.2,998,998,11835,9.25
+1333,2015 Maruti Swift VXI BSIV,Jun-15,Comprehensive,Petrol,5,73616,First Owner,Manual,2015,22,1197,1197,8180,3.75
+1334,2011 Hyundai i20 Magna,Feb-12,Comprehensive,Petrol,5,53657,First Owner,Manual,2011,18.5,1197,1197,805200,2.63
+1335,2014 Hyundai EON D Lite Plus,Oct-14,Comprehensive,Petrol,5,37016,First Owner,Manual,2014,814,552,552,745,2.05
+1336,2017 Honda Jazz 1.2 SV i VTEC,May-17,Comprehensive,Petrol,5,62466,First Owner,Manual,2017,18.7,1199,1199,887,3.9
+1337,2021 Hyundai Grand i10 Nios Sportz,Sep-21,Comprehensive,Petrol,5,20041,First Owner,Manual,2021,20.7,1197,1197,8186,6.19
+1338,2017 Maruti Swift VXI,Jan-17,Comprehensive,Petrol,5,49000,First Owner,Manual,2017,21.21,1197,1197,8180,3.65
+1339,2014 Maruti Swift Dzire VXI,Mar-14,Comprehensive,Petrol,5,44669,First Owner,Manual,2014,19.1,1197,1197,858,3.79
+1340,2019 Hyundai Grand i10 Nios AMT Sportz,Dec-19,Comprehensive,Petrol,5,28500,First Owner,Automatic,2019,20.7,1197,1197,8186,5.45
+1341,2014 Maruti Wagon R VXi BSII,Aug-14,Comprehensive,Petrol,5,19843,First Owner,Manual,2014,998,671,671,90,3.05
+1342,2014 Maruti Swift Dzire VXI,Oct-14,Comprehensive,Petrol,5,44800,First Owner,Manual,2014,19.1,1197,1197,858,3.81
+1343,2016 Maruti Swift VXI,Apr-16,Comprehensive,Petrol,5,44275,First Owner,Manual,2016,21.21,1197,1197,8180,3.75
+1344,2020 Maruti Swift VXI,Oct-20,Comprehensive,Petrol,5,27012,First Owner,Manual,2020,21.21,1197,1197,8180,5.45
+1345,2018 Maruti Wagon R VXI AMT 1.2,Nov-18,Comprehensive,Petrol,5,35629,First Owner,Automatic,2018,20.52,1197,1197,8180,4.25
+1346,2017 Maruti Alto K10 VXI,Jun-17,Comprehensive,Petrol,5,37009,First Owner,Manual,2017,23.95,998,998,6705,2.75
+1347,2011 Hyundai i10 Sportz AT,Aug-11,Comprehensive,Petrol,5,28000,First Owner,Automatic,2011,16.95,1197,1197,789,2.7
+1348,2014 Hyundai i10 Sportz 1.1L,Jan-14,Comprehensive,Petrol,5,46022,First Owner,Manual,2014,19.81,1086,1086,6805,2.35
+1349,2009 Hyundai i10 Era 1.1,2009,Third Party insurance,Petrol,5,100000,First Owner,Manual,2009,1086,6805,6805,9904,1.25
+1350,2018 Maruti Ertiga BSIV VXI,Dec-18,Comprehensive,Petrol,7,22302,First Owner,Manual,2018,17.5,1373,1373,911,6.9
+1351,2021 Audi Q8 55 TFSI Quattro BSVI,Oct-21,Third Party insurance,Petrol,5,17000,Second Owner,Automatic,2021,9.8,2995,2995,340,80
+1352,2023 Tata Harrier XZA Plus Red Dark Diesel AT BSVI,May-23,Comprehensive,Diesel,5,7400,First Owner,Automatic,2023,14.6,1956,1956,16767,20.25
+1353,2018 Datsun RediGO T Option,Apr-18,Comprehensive,Petrol,5,17024,Second Owner,Manual,2018,22.7,799,799,5364,2.72
+1354,2014 Toyota Etios Liva VXD,Nov-14,Comprehensive,Diesel,5,71649,First Owner,Manual,2014,23.59,1364,1364,6704,3.32
+1355,2022 Maruti Wagon R LXI,Nov-22,Comprehensive,Petrol,5,9016,First Owner,Manual,2022,998,6705,6705,90,5.05
+1356,2015 Toyota Etios V,Oct-15,Comprehensive,Petrol,5,44999,First Owner,Manual,2015,16.78,1496,1496,8873,3.74
+1357,2016 Renault Duster 85PS Diesel RxS,Aug-16,Comprehensive,Diesel,5,78106,First Owner,Manual,2016,19.87,1461,1461,838,5.1
+1358,2015 Hyundai EON Era Plus,Feb-15,Comprehensive,Petrol,5,34016,First Owner,Manual,2015,814,552,552,745,2.15
+1359,2014 Maruti Swift VDI BSIV,Sep-14,Comprehensive,Diesel,5,85692,First Owner,Manual,2014,25.2,1248,1248,74,3.47
+1360,2021 Tata Nexon XM BSVI,Mar-21,Third Party insurance,Petrol,5,6500,First Owner,Manual,2021,17.33,1199,1199,11835,7.98
+1361,2021 Hyundai Venue SX Turbo,Mar-21,Comprehensive,Petrol,5,35080,First Owner,Manual,2021,18.27,998,998,11835,8.99
+1362,2016 Volkswagen Polo 1.2 MPI Comfortline,Jun-16,Comprehensive,Petrol,5,77727,First Owner,Manual,2016,16.2,1199,1199,74,3.77
+1363,2014 Hyundai i20 Sportz 1.2,Oct-14,Comprehensive,Petrol,5,43000,First Owner,Manual,2014,18.5,1197,1197,8285,3.49
+1364,2019 Hyundai Grand i10 Sportz Petrol BSIV,Mar-19,Comprehensive,Petrol,5,30000,First Owner,Manual,2019,18.9,1197,1197,8186,4.25
+1365,2016 Mahindra NuvoSport N6,Nov-16,Comprehensive,Diesel,7,42364,First Owner,Manual,2016,17.45,1493,1493,100,4.5
+1366,2015 Honda Brio VX AT,Sep-15,Comprehensive,Petrol,5,7000,Second Owner,Automatic,2015,16.5,1198,1198,868,4.95
+1367,2016 Honda Jazz 1.2 V i VTEC,Nov-16,Comprehensive,Petrol,5,54000,First Owner,Manual,2016,18.7,1199,1199,887,3.95
+1368,2009 Maruti Swift Dzire VXi,Jan-09,Comprehensive,Petrol,5,45000,First Owner,Manual,2009,17.5,1298,1298,858,2.25
+1369,2013 Maruti Swift Dzire VXI,Nov-13,Comprehensive,Petrol,5,44018,First Owner,Manual,2013,19.1,1197,1197,858,3.45
+1370,2020 Honda Civic VX,Jan-20,Third Party insurance,Petrol,5,18500,First Owner,Automatic,2020,16.5,1799,1799,13946,12.9
+1371,2011 Hyundai Santro Xing GLS,Sep-11,Comprehensive,Petrol,5,43002,First Owner,Manual,2011,17.92,1086,1086,621,1.75
+1372,2020 Mercedes-Benz GLC 200,Dec-20,Third Party insurance,Petrol,5,13200,First Owner,Automatic,2020,12.74,1991,1991,197,50
+1373,2019 Renault KWID 1.0 RXT Optional,Sep-19,Comprehensive,Petrol,5,69381,First Owner,Manual,2019,23.01,999,999,67,3.27
+1374,2015 Hyundai Creta 1.6 CRDi SX Option,Sep-15,Comprehensive,Diesel,5,64275,First Owner,Manual,2015,19.67,1582,1582,1262,6.28
+1375,2021 Mahindra Thar LX 4-Str Convert Top AT BSVI,Feb-21,Comprehensive,Petrol,4,7421,First Owner,Automatic,2021,15.2,1997,1997,150,12.49
+1376,2021 Honda City ZX CVT,Dec-21,Comprehensive,Petrol,5,5252,First Owner,Automatic,2021,18.3,1498,1498,11935,12.07
+1377,2014 Toyota Etios V,Jan-15,Comprehensive,Petrol,5,63663,First Owner,Manual,2014,16.78,1496,1496,8873,3.41
+1378,2015 Honda City i VTEC VX,Apr-15,Comprehensive,Petrol,5,60545,First Owner,Manual,2015,17.8,1497,1497,1173,5.55
+1379,2016 Honda Amaze S i-VTEC,Oct-16,Comprehensive,Petrol,5,85602,First Owner,Manual,2016,17.8,1198,1198,867,3.33
+1380,2019 Toyota Fortuner 2.8 4WD AT BSIV,Sep-19,Comprehensive,Diesel,7,35902,First Owner,Automatic,2019,15.04,2755,2755,1745,28
+1381,2018 Hyundai Creta 1.6 SX Option,Aug-18,Comprehensive,Petrol,5,87172,First Owner,Manual,2018,15.8,1591,1591,1213,7.88
+1382,2014 Volkswagen Polo Petrol Highline 1.2L,Oct-14,Comprehensive,Petrol,5,52950,Second Owner,Manual,2014,16.47,1198,1198,739,3.72
+1383,2016 Hyundai Verna 1.6 VTVT S,Jan-16,Comprehensive,Petrol,5,42005,First Owner,Manual,2016,17.01,1591,1591,1213,4.71
+1384,2018 Hyundai Creta 1.6 SX Option,Nov-18,Comprehensive,Petrol,5,64000,First Owner,Manual,2018,15.8,1591,1591,1213,8.25
+1385,2019 Hyundai Verna VTVT 1.6 SX Option,Nov-19,Comprehensive,Petrol,5,32000,First Owner,Manual,2019,17,1591,1591,1213,8.25
+1386,2018 Hyundai Creta 1.6 SX Option,Jun-18,Comprehensive,Petrol,5,65000,First Owner,Manual,2018,15.8,1591,1591,1213,8.5
+1387,2018 Hyundai Elantra 2.0 SX,Aug-18,Comprehensive,Petrol,5,21000,First Owner,Manual,2018,14.59,1999,1999,14992,8.85
+1388,2016 Toyota Corolla Altis 1.8 G CVT,Apr-16,Comprehensive,Petrol,5,39450,First Owner,Automatic,2016,14.28,1798,1798,13803,8.15
+1389,2017 Hyundai Elantra 2.0 SX,Apr-19,Comprehensive,Petrol,5,32000,First Owner,Manual,2017,14.59,1999,1999,14992,8.85
+1390,2018 Honda WR-V i-VTEC VX,Jun-18,Comprehensive,Petrol,5,60314,First Owner,Manual,2018,17.5,1199,1199,887,5.75
+1391,2018 Hyundai Verna VTVT 1.4 EX,Dec-18,Comprehensive,Petrol,5,4000,First Owner,Manual,2018,19.1,1368,1368,986,7.49
+1392,2017 Maruti Ciaz Delta Diesel,Nov-17,Comprehensive,Diesel,5,65000,First Owner,Automatic,2017,28.09,1248,1248,8850,5.25
+1393,2015 Hyundai Creta 1.6 CRDi SX Option,Dec-15,Comprehensive,Diesel,5,78019,First Owner,Manual,2015,19.67,1582,1582,1262,6.39
+1394,2020 Renault Duster RXZ,Sep-20,Comprehensive,Petrol,5,42970,First Owner,Manual,2020,16.42,1498,1498,10455,7.64
+1395,2010 Toyota Innova 2.5 GX 7 STR BSIV,Jun-10,Comprehensive,Diesel,7,176000,First Owner,Manual,2010,12.8,2494,2494,102,4.4
+1396,2019 Maruti Wagon R VXI 1.2,Feb-19,Comprehensive,Petrol,5,24100,First Owner,Manual,2019,20.52,1197,1197,8180,4.74
+1397,2015 Maruti Baleno 1.2 Alpha,Dec-15,Comprehensive,Petrol,5,51123,First Owner,Manual,2015,21.4,1197,1197,831,4.71
+1398,2016 Skoda Octavia Ambition 1.4 TSI MT,May-16,Comprehensive,Petrol,5,66000,First Owner,Manual,2016,16.8,1395,1395,13802,5.95
+1399,2015 Maruti Baleno 1.3 Zeta,Feb-16,Comprehensive,Diesel,5,48405,First Owner,Manual,2015,27.39,1248,1248,74,4.98
+1400,2013 Audi A6 2.0 TDI Premium Plus,Nov-13,Comprehensive,Diesel,5,52305,First Owner,Automatic,2013,17.68,1968,1968,17433,10.75
+1401,2015 Hyundai Grand i10 CRDi Asta,Jun-15,Comprehensive,Diesel,5,46488,Second Owner,Manual,2015,24,1120,1120,70,3.71
+1402,2018 Hyundai i20 Diesel Sportz,Jan-19,Comprehensive,Diesel,5,71842,First Owner,Manual,2018,22.54,1396,1396,8876,5.29
+1403,2014 Honda City i DTEC SV,Jul-14,Comprehensive,Diesel,5,91000,Third Owner,Manual,2014,26,1498,1498,986,3.95
+1404,2013 Hyundai i20 Magna 1.4 CRDi (Diesel),Jul-13,Comprehensive,Diesel,5,51334,First Owner,Manual,2013,21.9,1396,1396,8876,2.8
+1405,2016 Toyota Fortuner 2.8 2WD AT BSIV,Apr-16,Comprehensive,Diesel,7,72560,First Owner,Automatic,2016,12.9,2755,2755,1745,16.7
+1406,2018 Hyundai Santro Sportz BSIV,Dec-18,Comprehensive,Petrol,5,68000,First Owner,Manual,2018,20.3,1086,1086,68,3.85
+1407,2014 Maruti Swift Dzire VXI,Jan-14,Comprehensive,Petrol,5,45000,First Owner,Manual,2014,22.41,1197,1197,8850,3.6
+1408,2013 Mitsubishi Cedia Sports,Mar-13,Comprehensive,Petrol,5,44000,First Owner,Manual,2013,13.17,1999,1999,114,3.95
+1409,2016 Skoda Superb LK 1.8 TSI AT,Jul-16,Comprehensive,Petrol,5,47000,First Owner,Automatic,2016,14.67,1798,1798,17746,10.95
+1410,2016 Toyota Fortuner 4x2 AT,May-16,Comprehensive,Diesel,7,92044,First Owner,Automatic,2016,12.55,2982,2982,1685,16.5
+1411,2018 Audi Q7 45 TDI Quattro Technology,2018,Third Party insurance,Diesel,7,40000,First Owner,Automatic,2018,14.75,2967,2967,245,46
+1412,2015 Honda City i VTEC VX,Apr-15,Comprehensive,Petrol,5,60545,First Owner,Manual,2015,17.4,1497,1497,1173,5.5
+1413,2014 Maruti Ritz VDi,Oct-14,Comprehensive,Diesel,5,79097,First Owner,Manual,2014,1248,7394,7394,190,3.29
+1414,2013 Maruti Swift Dzire VXI,Jan-14,Comprehensive,Petrol,5,68619,Second Owner,Manual,2013,19.1,1197,1197,858,3.44
+1415,2014 Audi Q5 30 TDI quattro Premium,May-14,Comprehensive,Diesel,5,34452,First Owner,Automatic,2014,14.16,1968,1968,1743,16.75
+1416,2017 Hyundai Grand i10 1.2 CRDi Sportz,Jul-17,Comprehensive,Diesel,5,40326,First Owner,Manual,2017,24,1186,1186,7397,5.22
+1417,2019 Datsun GO T Option,Sep-19,Comprehensive,Petrol,5,40021,First Owner,Manual,2019,19.02,1198,1198,6705,3.92
+1418,2019 Maruti Wagon R LXI,Nov-19,Comprehensive,Petrol,5,44000,First Owner,Manual,2019,998,6705,6705,90,3.99
+1419,2019 Maruti Wagon R VXI 1.2,Jan-20,Third Party,Petrol,5,7962,First Owner,Manual,2019,20.52,1197,1197,8180,4.89
+1420,2012 Toyota Innova 2.5 VX 7 STR BSIV,Jun-12,Comprehensive,Diesel,7,260000,First Owner,Manual,2012,12.8,2494,2494,102,6.25
+1421,2018 Nissan Micra Active XV,May-18,Comprehensive,Petrol,5,44508,First Owner,Manual,2018,19.69,1198,1198,6704,3.38
+1422,2014 Hyundai Elantra SX AT,Mar-14,Comprehensive,Petrol,5,58958,First Owner,Automatic,2014,14.5,1797,1797,1475,5.25
+1423,2018 Maruti Ignis 1.2 Zeta BSIV,Aug-18,Third Party insurance,Petrol,5,44000,Second Owner,Manual,2018,20.89,1197,1197,8180,4.65
+1424,2022 Toyota Urban cruiser Premium,May-22,Comprehensive,Petrol,5,48188,First Owner,Manual,2022,17.03,1462,1462,10326,8.25
+1425,2009 Hyundai i10 Sportz,Dec-09,Comprehensive,Petrol,5,55000,First Owner,Manual,2009,20.36,1197,1197,789,1.51
+1426,2013 Hyundai Grand i10 Magna,Oct-13,Comprehensive,Petrol,5,24268,First Owner,Manual,2013,1197,82,82,114,2.85
+1427,2019 Hyundai Creta 1.6 CRDi AT SX Plus,Mar-19,Comprehensive,Diesel,5,23000,First Owner,Automatic,2019,17.01,1582,1582,1262,10.5
+1428,2020 MG Hector Sharp AT BSIV,Dec-20,Comprehensive,Petrol,5,38502,First Owner,Automatic,2020,13.96,1451,1451,141,13.75
+1429,2017 Hyundai Creta 1.6 CRDi SX Plus,Jun-17,Comprehensive,Diesel,5,35000,First Owner,Manual,2017,19.67,1582,1582,1262,7.5
+1430,2020 Kia Seltos GTX Plus,Jan-20,Comprehensive,Petrol,5,43487,First Owner,Manual,2020,16.5,1353,1353,13808,13.5
+1431,2018 Maruti Vitara Brezza ZDi Plus AMT Dual Tone,Jul-18,Comprehensive,Diesel,5,32000,First Owner,Automatic,2018,24.3,1248,1248,885,7.5
+1432,2019 Mercedes-Benz GLA Class 200 d Sport,Apr-19,Third Party insurance,Diesel,5,14400,First Owner,Automatic,2019,17.9,2143,2143,136,24
+1433,2017 Volkswagen Polo 1.2 MPI Trendline,Oct-17,Comprehensive,Petrol,5,62920,First Owner,Manual,2017,1198,74,74,110,5.27
+1434,2012 Maruti A-Star Vxi,Feb-12,Comprehensive,Petrol,5,60467,First Owner,Manual,2012,19,998,998,661,2.8
+1435,2014 Hyundai i10 Sportz 1.1L,Aug-14,Comprehensive,Petrol,5,65017,Second Owner,Manual,2014,19.81,1086,1086,6805,2.25
+1436,2017 Maruti Swift Dzire ZXI 1.2,Nov-17,Comprehensive,Petrol,5,38015,First Owner,Manual,2017,21.21,1197,1197,8180,5.47
+1437,2017 Toyota Etios Liva 1.2 V,Oct-17,Comprehensive,Petrol,5,49134,First Owner,Manual,2017,17.71,1197,1197,789,4.42
+1438,2016 Maruti Wagon R VXI AMT,Jan-16,Comprehensive,Petrol,5,37100,Second Owner,Automatic,2016,21.79,998,998,6705,3.1
+1439,2021 Hyundai i20 Asta Opt Turbo DCT BSVI,Mar-21,Comprehensive,Petrol,5,69977,First Owner,Automatic,2021,20.28,998,998,11841,8.69
+1440,2017 Nissan Micra CVT XV,Dec-17,Comprehensive,Petrol,5,16937,First Owner,Automatic,2017,19.34,1198,1198,7594,3.25
+1441,2018 Mahindra XUV500 W7 BSIV,May-18,Comprehensive,Diesel,7,51441,First Owner,Manual,2018,15.1,2179,2179,15287,10.71
+1442,2017 Maruti Swift Dzire AMT ZXI,Jul-17,Comprehensive,Petrol,5,53947,First Owner,Automatic,2017,21.21,1197,1197,8180,5.62
+1443,2020 Kia Seltos GTX Option,Nov-20,Comprehensive,Petrol,5,30000,First Owner,Manual,2020,16.5,1353,1353,13808,13.2
+1444,2015 Hyundai i20 Asta 1.2,Apr-15,Third Party,Petrol,5,40909,First Owner,Manual,2015,18.6,1197,1197,8183,4.35
+1445,2019 Mahindra TUV 300 T6 Plus,Nov-19,Comprehensive,Diesel,7,70000,First Owner,Manual,2019,18.49,1493,1493,100,5.75
+1446,2011 Maruti Swift Dzire 1.2 Vxi BSIV,May-11,Comprehensive,Petrol,5,69000,Second Owner,Manual,2011,17.5,1197,1197,858,2.25
+1447,2017 Honda Jazz 1.2 SV i VTEC,Mar-17,Comprehensive,Petrol,5,28662,First Owner,Manual,2017,18.7,1199,1199,887,3.85
+1448,2021 Tata Harrier XTA Plus AT BSVI,Nov-21,Comprehensive,Diesel,5,46912,First Owner,Automatic,2021,14.6,1956,1956,16767,16.25
+1449,2014 Audi Q3 2.0 TFSI Quattro Premium Plus,2014,Third Party insurance,Petrol,5,90000,1984 cc,2014,Power Steering,1984,207,207,300,8
+1450,2013 Volkswagen Vento Petrol Comfortline,Nov-13,Comprehensive,Petrol,5,65000,First Owner,Manual,2013,15.04,1598,1598,1036,2.5
+1451,2013 Mercedes-Benz C-Class C 220 CDI Avantgarde,Dec-13,Comprehensive,Diesel,5,40238,First Owner,Automatic,2013,19.27,2143,2143,170,12.5
+1452,2020 Volkswagen Ameo 1.5 TDI Comfortline,Mar-20,Comprehensive,Diesel,5,52000,First Owner,Manual,2020,21.66,1498,1498,10862,4.45
+1453,2021 Hyundai Santro Asta,Mar-21,Comprehensive,Petrol,5,22873,First Owner,Manual,2021,20.3,1086,1086,6805,4.73
+1454,2012 Maruti A-Star Zxi,Oct-12,Comprehensive,Petrol,5,77389,First Owner,Manual,2012,19,998,998,661,2.27
+1455,2018 Maruti Swift VVT VXI,Dec-18,Comprehensive,Petrol,5,32000,First Owner,Manual,2018,22,1197,1197,8180,5.3
+1456,2016 Skoda Rapid 1.5 TDI AT Style Plus,Oct-16,Comprehensive,Diesel,5,88935,First Owner,Automatic,2016,21.66,1498,1498,10352,4.85
+1457,2018 Nissan Micra Active XV,Oct-18,Comprehensive,Petrol,5,53681,Second Owner,Manual,2018,19.69,1198,1198,6704,3.04
+1458,2018 Mahindra Bolero ZLX,Aug-18,Third Party insurance,Diesel,7,60000,First Owner,Manual,2018,15.96,2523,2523,621,5.65
+1459,2015 Hyundai i20 Active 1.4 SX,May-15,Comprehensive,Diesel,5,49441,First Owner,Manual,2015,21.19,1396,1396,8873,4.89
+1460,2019 Toyota Innova Crysta 2.4 VX MT BSIV,Aug-19,Comprehensive,Diesel,7,41000,First Owner,Manual,2019,13.68,2393,2393,1478,16.95
+1461,2021 Maruti Ciaz S,Mar-21,Comprehensive,Petrol,5,23838,First Owner,Manual,2021,20.65,1462,1462,10325,8.85
+1462,2021 Skoda Octavia L and K 1.9 TDI MT,Mar-21,Comprehensive,Diesel,5,26719,First Owner,Manual,2021,16.4,1896,1896,90,7.89
+1464,2017 Mahindra TUV 300 mHAWK100 T8,Apr-17,Comprehensive,Diesel,7,27236,Second Owner,Manual,2017,18.49,1493,1493,100,6.5
+1465,2015 Honda City i DTEC VX,May-15,Comprehensive,Diesel,5,41080,First Owner,Manual,2015,25.1,1498,1498,986,5.9
+1466,2016 Toyota Etios 1.4 VXD,Jan-16,Comprehensive,Diesel,5,72793,First Owner,Manual,2016,23.59,1364,1364,6704,4.55
+1467,2014 Hyundai i10 Sportz,Jun-14,Comprehensive,Petrol,5,64000,Third Owner,Manual,2014,20.36,1197,1197,789,2.35
+1468,2020 Jaguar F-Pace Prestige 2.0 AWD,2020,Third Party insurance,Diesel,5,30000,First Owner,Automatic,2020,16.38,1999,1999,177,39
+1469,2017 Maruti Ignis Zeta,Nov-17,Comprehensive,Petrol,5,32002,First Owner,Manual,2017,20.89,1197,1197,8180,4.41
+1470,2018 Renault Duster 85PS Diesel RxS,Jun-18,Comprehensive,Diesel,5,105000,First Owner,Manual,2018,19.87,1461,1461,838,5.25
+1471,2017 BMW 3 Series 320d,2017,Third Party insurance,Diesel,5,30000,First Owner,Automatic,2017,22.69,1995,1995,190,16
+1472,2020 Maruti Wagon R VXI 1.2,Feb-20,Comprehensive,Petrol,5,20827,First Owner,Manual,2020,20.52,1197,1197,8180,4.6
+1473,2017 Mahindra Bolero mHAWK D70 ZLX,Oct-17,Third Party insurance,Diesel,7,37852,Second Owner,Manual,2017,16.5,1493,1493,70,6.75
+1474,2022 Tata Harrier XZA AT BSVI,Feb-22,Comprehensive,Diesel,5,16683,First Owner,Automatic,2022,14.6,1956,1956,16767,19.24
+1475,2011 Hyundai i10 Magna 1.2,Aug-11,Comprehensive,Petrol,5,53135,First Owner,Manual,2011,1197,789,789,1117,1.8
+1476,2017 Hyundai Grand i10 1.2 Kappa Sportz BSIV,May-17,Comprehensive,Petrol,5,32230,First Owner,Manual,2017,18.9,1197,1197,8186,5.13
+1477,2022 BMW 5 Series 520d Luxury Line,Mar-22,Comprehensive,Diesel,5,11000,First Owner,Automatic,2022,20.37,1995,1995,18774,69.5
+1478,2022 Volkswagen Taigun 1.0 TSI Topline AT BSVI,Sep-22,Comprehensive,Petrol,5,10400,First Owner,Automatic,2022,18.41,999,999,11398,16.35
+1479,2022 Hyundai Grand i10 Nios Asta,Feb-22,Comprehensive,Petrol,5,23748,First Owner,Manual,2022,20.7,1197,1197,8186,6.55
+1480,2018 Honda Amaze V CVT Petrol,Jul-18,Comprehensive,Petrol,5,13513,First Owner,Automatic,2018,18.3,1199,1199,8876,7.65
+1481,2022 Tata Nexon XZA Plus AMT BSVI,Jan-22,Third Party,Petrol,5,12952,First Owner,Automatic,2022,17.05,1199,1199,11835,10.99
+1482,2014 Hyundai Grand i10 Sportz,May-14,Comprehensive,Petrol,5,22672,First Owner,Manual,2014,18.9,1197,1197,82,3.84
+1483,2012 Maruti Wagon R VXI BS IV,Jul-12,Comprehensive,Petrol,5,23000,First Owner,Manual,2012,18.9,998,998,671,2.9
+1484,2017 Hyundai i20 Sportz 1.2,Jul-17,Comprehensive,Petrol,5,41048,First Owner,Manual,2017,18.6,1197,1197,8183,5.48
+1485,2018 Isuzu MU-X 2WD,2018,Third Party insurance,Diesel,7,40000,2999 cc,2018,Power Steering,2999,17457,17457,380,21
+1486,2021 BMW 5 Series 520d Luxury Line,Feb-21,Comprehensive,Diesel,5,10000,First Owner,Automatic,2021,20.37,1995,1995,18774,58.75
+1487,2013 Hyundai i10 Sportz,Dec-13,Comprehensive,Petrol,5,1800,First Owner,Manual,2013,20.36,1197,1197,789,3.15
+1488,2019 Jeep Compass 1.4 Limited Plus BSIV,May-19,Comprehensive,Petrol,5,34000,First Owner,Automatic,2019,16,1368,1368,16077,17.5
+1489,2016 Maruti Baleno 1.2 Zeta,2016,Third Party insurance,Petrol,5,40000,First Owner,Manual,2016,21.4,1197,1197,831,4.7
+1490,2021 Toyota Urban cruiser Premium AT,Jul-21,Zero Dep,Petrol,5,30000,First Owner,Automatic,2021,18.76,1462,1462,10326,11.4
+1491,2018 Hyundai Grand i10 Sportz,Aug-18,Comprehensive,Petrol,5,22700,First Owner,Manual,2018,18.9,1197,1197,8186,5.45
+1492,2019 BMW X7 xDrive 40i M Sport,Oct-19,Comprehensive,Petrol,7,28000,First Owner,Automatic,2019,10.54,2998,2998,33525,99
+1493,2010 Maruti Wagon R LXI Minor,Mar-10,Third Party,Petrol,5,79862,First Owner,Manual,2010,1061,67,67,84,1.69
+1494,2018 Hyundai Creta 1.6 VTVT AT SX Plus,Mar-18,Comprehensive,Petrol,5,29146,First Owner,Automatic,2018,13,1591,1591,1213,11.35
+1495,2022 Maruti Baleno Alpha AMT BSVI,Apr-22,Comprehensive,Petrol,5,5500,First Owner,Automatic,2022,22.94,1197,1197,8850,9.35
+1496,2014 Hyundai i10 Sportz,Aug-14,Comprehensive,Petrol,5,35925,Second Owner,Manual,2014,20.36,1197,1197,789,3.14
+1497,2018 Maruti Wagon R VXI AMT,Apr-18,Comprehensive,Petrol,5,57999,First Owner,Automatic,2018,21.79,998,998,6705,4.59
+1498,2012 Maruti Wagon R VXI BS IV,Jul-12,Comprehensive,Petrol,5,23000,First Owner,Manual,2012,18.9,998,998,671,2.9
+1499,2017 Maruti Baleno 1.2 Alpha,Mar-17,Comprehensive,Petrol,5,14352,Second Owner,Manual,2017,21.4,1197,1197,831,5.87
+1500,2021 BMW 5 Series 520d Luxury Line,Feb-21,Comprehensive,Diesel,5,10000,First Owner,Automatic,2021,20.37,1995,1995,18774,58.75
+1501,2014 Maruti Ertiga VXI CNG,Jun-14,Comprehensive,CNG,7,49999,First Owner,Manual,2014,22.8,1373,1373,809,6.34
+1502,2018 Maruti Baleno 1.2 Zeta,Aug-18,Comprehensive,Petrol,5,21194,First Owner,Manual,2018,21.4,1197,1197,831,6.37
+1503,2013 Hyundai i10 Sportz,Dec-13,Comprehensive,Petrol,5,1800,First Owner,Manual,2013,20.36,1197,1197,789,3.15
+1504,2020 Hyundai Grand i10 Nios Sportz CNG,Oct-20,Comprehensive,CNG,5,27019,First Owner,Manual,2020,1197,6805,6805,952,6.7
+1505,2016 Audi A3 35 TDI Premium Plus,2016,Third Party insurance,Diesel,5,80000,1968 cc,2016,Power Steering,1968,143,143,320,15.3
+1506,2020 Maruti Vitara Brezza ZDi AMT,Feb-20,Comprehensive,Diesel,5,24000,First Owner,Automatic,2020,24.3,1248,1248,885,9.95
+1507,2010 Honda City 1.5 V MT,Jan-10,Comprehensive,Petrol,5,32000,First Owner,Manual,2010,17,1497,1497,1186600,2.4
+1508,2020 Volvo XC40 T4 R-Design BSIV,Sep-20,Third Party insurance,Petrol,5,22600,First Owner,Automatic,2020,1969,190,190,300,37.75
+1509,2022 Volvo XC 90 B6 Inscription 7STR,2022,Third Party insurance,Petrol,7,10000,First Owner,Automatic,2022,17.2,1969,1969,29589,85
+1510,2019 Jeep Compass 1.4 Limited Plus BSIV,May-19,Comprehensive,Petrol,5,34000,First Owner,Automatic,2019,16,1368,1368,16077,17.5
+1511,2021 Toyota Urban cruiser Premium AT,Jul-21,Zero Dep,Petrol,5,30000,First Owner,Automatic,2021,18.76,1462,1462,10326,11.4
+1512,2018 Hyundai Grand i10 Sportz,Aug-18,Comprehensive,Petrol,5,22700,First Owner,Manual,2018,18.9,1197,1197,8186,5.45
+1513,2021 Audi Q2 Premium,Dec-21,Comprehensive,Petrol,5,9700,First Owner,Automatic,2021,1984,18774,18774,320,35.49
+1514,2020 Maruti Baleno Zeta,Jun-20,Comprehensive,Petrol,5,13519,First Owner,Manual,2020,21.01,1197,1197,8180,6.94
+1515,2017 Hyundai Creta 1.6 VTVT AT SX Plus,Dec-17,Comprehensive,Petrol,5,45017,First Owner,Automatic,2017,13,1591,1591,1213,8.75
+1516,2013 Maruti Swift VXI BSIV,Jul-13,Comprehensive,Petrol,5,78308,First Owner,Manual,2013,22,1197,1197,8180,3.57
+1517,2017 Honda Jazz V CVT,Nov-17,Third Party insurance,Petrol,5,79852,First Owner,Automatic,2017,18.2,1199,1199,887,5.69
+1518,2019 BMW X7 xDrive 40i M Sport,Oct-19,Comprehensive,Petrol,7,28000,First Owner,Automatic,2019,10.54,2998,2998,33525,99
+1519,2016 Hyundai EON Magna Plus,Dec-16,Zero Dep,Petrol,5,18049,First Owner,Manual,2016,21.1,814,814,552,3.15
+1520,2022 Volkswagen Taigun 1.0 TSI Topline ES,Nov-22,Comprehensive,Petrol,5,19500,First Owner,Manual,2022,19.87,999,999,11398,16.21
+1521,2018 Audi Q5 35TDI,Sep-18,Comprehensive,Diesel,5,35000,First Owner,Automatic,2018,17.01,1968,1968,188,41.99
+1522,2021 Maruti Ignis Zeta BSVI,Aug-21,Comprehensive,Petrol,5,7643,First Owner,Manual,2021,20.89,1197,1197,8180,6.19
+1523,2015 Hyundai i20 Magna 1.2,Mar-15,Third Party insurance,Petrol,5,12000,First Owner,Manual,2015,18.6,1197,1197,8183,5.31
+1524,2014 Hyundai Grand i10 AT Asta,Feb-15,Comprehensive,Petrol,5,22316,First Owner,Automatic,2014,18.9,1197,1197,82,4.54
+1525,2021 MG Hector Sharp CVT,2021,Third Party insurance,Petrol,5,40000,Second Owner,Automatic,2021,1451,141,141,250,16
+1526,2010 Hyundai i10 Magna 1.2,Jan-10,Third Party insurance,Petrol,5,45221,First Owner,Manual,2010,1197,789,789,1117,2.35
+1527,2021 Maruti Baleno Zeta CVT,Oct-21,Comprehensive,Petrol,5,35000,First Owner,Automatic,2021,19.56,1197,1197,8180,8.45
+1528,2021 BMW X7 xDrive 40i M Sport,Aug-21,Zero Dep,Petrol,7,7000,First Owner,Automatic,2021,10.54,2998,2998,33525,1.15
+1529,2020 MG Hector Sharp Diesel MT,2020,Third Party insurance,Diesel,5,40000,First Owner,Manual,2020,17.41,1956,1956,16768,17
+1530,2016 Honda City i VTEC SV,Dec-16,Comprehensive,Petrol,5,38671,Second Owner,Manual,2016,17.8,1497,1497,1173,6.25
+1531,2012 Hyundai i20 1.2 Sportz Option,Feb-12,Third Party insurance,Petrol,5,49303,Second Owner,Manual,2012,17,1197,1197,805200,2.8
+1532,2014 Nissan Sunny XL CVT,Jul-14,Comprehensive,Petrol,5,65000,First Owner,Automatic,2014,17.97,1498,1498,9961,2.95
+1533,2018 Audi Q3 30 TFSI Premium FWD,Mar-18,Comprehensive,Petrol,5,68000,First Owner,Automatic,2018,16.9,1395,1395,14751,24.99
+1534,2019 Hyundai Venue SX Turbo,Aug-19,Comprehensive,Petrol,5,17536,First Owner,Manual,2019,18.27,998,998,11835,9.7
+1535,2017 Honda Jazz 1.2 V i VTEC,Jun-17,Third Party insurance,Petrol,5,30400,First Owner,Manual,2017,18.7,1199,1199,887,5.35
+1536,2020 MG Hector Hybrid Sharp MT,Feb-20,Comprehensive,Petrol,5,15071,First Owner,Manual,2020,1451,141,141,250,14.28
+1537,2015 Maruti SX4 S Cross DDiS 200 Zeta,Jul-15,Comprehensive,Diesel,5,80100,First Owner,Manual,2015,23.65,1248,1248,885,6.25
+1538,2021 Hyundai Verna SX IVT,Jun-21,Comprehensive,Petrol,5,10773,First Owner,Automatic,2021,18.45,1497,1497,11318,11.85
+1539,2020 Tata Tigor XZA Plus,Mar-20,Zero Dep,Petrol,5,10957,First Owner,Automatic,2020,20.3,1199,1199,8381,7.53
+1540,2022 Tata Tiago XZ,Aug-22,Comprehensive,Petrol,5,19000,First Owner,Manual,2022,20.09,1199,1199,8482,7.45
+1541,2015 Hyundai Verna 1.6 SX CRDI (O) AT,Jul-15,Third Party insurance,Diesel,5,87900,Second Owner,Automatic,2015,22.32,1582,1582,12632,6.5
+1542,2021 Maruti Ignis Zeta AMT BSVI,Feb-22,Comprehensive,Petrol,5,16100,First Owner,Automatic,2021,20.89,1197,1197,8180,6.44
+1543,2016 Toyota Etios Cross 1.4L VD,Aug-16,Comprehensive,Diesel,5,48650,First Owner,Manual,2016,23.59,1364,1364,6706,5.25
+1544,2018 Hyundai Creta 1.6 SX Automatic,Dec-18,Comprehensive,Petrol,5,29252,First Owner,Automatic,2018,14.8,1591,1591,1213,11.05
+1545,2022 Maruti Ignis Sigma BSVI,2022,Third Party insurance,Petrol,5,2300,First Owner,Manual,2022,1197,8180,8180,113,5.9
+1546,2018 Honda Jazz V CVT,May-18,Comprehensive,Petrol,5,19446,First Owner,Automatic,2018,18.2,1199,1199,887,6.5
+1547,2022 Maruti Ertiga VXI CNG,May-22,Third Party insurance,CNG,7,26500,First Owner,Manual,2022,26.11,1462,1462,8663,11.5
+1548,2020 Hyundai Creta SX Opt Diesel AT BSVI,Aug-20,Comprehensive,Diesel,5,35000,First Owner,Automatic,2020,1493,11345,11345,250,17.41
+1549,2022 Renault KWID 1.0 RXL Opt BSVI,2022,Third Party insurance,Petrol,5,10000,999 cc,2022,Power Steering,999,6706,6706,91,3.98
+1550,2017 Honda WR-V i-VTEC S,Jun-17,Comprehensive,Petrol,5,49000,First Owner,Manual,2017,17.5,1199,1199,887,5.85
+1551,2018 Volkswagen Polo 1.0 MPI Comfortline,May-18,Comprehensive,Petrol,5,40000,Second Owner,Manual,2018,18.78,999,999,75,4.75
+1552,2018 Maruti Swift Dzire VXI,May-18,Comprehensive,Petrol,5,34756,First Owner,Manual,2018,20.85,1197,1197,8314,6.1
diff --git a/run.py b/run.py
index 8f4d75d..fabcf3f 100644
--- a/run.py
+++ b/run.py
@@ -1,6 +1,8 @@
 import os
+import subprocess
 import sys
 from datetime import datetime
+import time
 
 # ASCII art
 ml2sql = r"""
@@ -20,7 +22,10 @@
 
 # List files in input/data/ directory
 data_dir = "input/data/"
-files = os.listdir(data_dir)
+files=[]
+for f in os.listdir(data_dir):
+    if f.endswith(".csv"):
+        files.append(f)
 files.sort()
 
 print("Files in input/data/:")
@@ -39,30 +44,68 @@
 
 print(f"CSV file {csv_path} will be used for modelling")
 
+# Function to create a new config file
+def create_new_config(csv_path):
 
-# List files in input/configuration/ directory
-configuration_dir = "input/configuration/"
-files = os.listdir(configuration_dir)
-files.sort()
+    if sys.platform == "win32":
+        command = f".ml2sql\Scripts\python.exe scripts/create_config.py --data_path {csv_path}"
+    else:
+        command = f".ml2sql/bin/python scripts/create_config.py --data_path {csv_path}"
 
-print(f"\n\nFiles in {configuration_dir}:")
-for i, file in enumerate(files, 1):
-    print(f"{i}. {file}")
+    print(command)
+
+    os.system(command)
 
 # Ask for JSONPATH
 json_path = None
 while json_path is None:
+    # List files in input/configuration/ directory
+    files = []
+    configuration_dir = "input/configuration/"
+    for f in os.listdir(configuration_dir):
+        if f.endswith(".json"):
+            files.append(f)
+    files.sort()
+
+    # Include option to create a new config file
+    files.insert(0, "Create New Config File")
+
+    # List the configuration files
+    print(f"\n\nFiles in {configuration_dir}:")
+    for i, file in enumerate(files, 1):
+        if file != "Create New Config File":
+            last_mod_ts = os.path.getmtime(configuration_dir+file)
+        else:
+            last_mod_ts = 0
+
+        if time.time() - last_mod_ts < 10:
+            print(f"{i}. {file} (New)")
+        else:
+            print(f"{i}. {file}")
+
+        
+
+    # prompt user to select config file
     json_file_index = input("\nSelect JSON file for training configuration: ")
     try:
         json_file_index = int(json_file_index) - 1
-        json_path = os.path.join(configuration_dir, files[json_file_index])
+
+        if json_file_index == 0:
+            create_new_config(csv_path)
+        else:
+            json_path = os.path.join(configuration_dir, files[json_file_index])
     except (ValueError, IndexError):
         print("Invalid option, try again.")
 
 print(f"Configuration file {json_path} will be used for modelling")
 
 # Ask for MODEL_TYPE
-model_types = ["Explainable Boosting Machine", "Decision Tree", "Decision Rule", "Logistic/Linear regression"]
+model_types = [
+    "Explainable Boosting Machine",
+    "Decision Tree",
+    # "Decision Rule",
+    "Logistic/Linear regression",
+]
 model_type = None
 while model_type is None:
     print("\nWhat type of model do you want?")
@@ -80,26 +123,28 @@
 print(f"Algorithm chosen for modelling: {model_type}")
 
 # Rename model choice for easier reference in code later on
-model_type = 'ebm' if model_type == 'Explainable Boosting Machine' else model_type
-model_type = 'l_regression' if model_type == 'Logistic/Linear regression' else model_type
+model_type = "ebm" if model_type == "Explainable Boosting Machine" else model_type
+model_type = (
+    "l_regression" if model_type == "Logistic/Linear regression" else model_type
+)
 model_type = model_type.lower().replace(" ", "_")
 
 # Model name
 unique_name = False
-while not unique_name: 
+while not unique_name:
     model_name = input("\nGive it a name: ")
 
     # Current date
-    current_date = datetime.today().strftime('%Y%m%d')
+    current_date = datetime.today().strftime("%Y%m%d")
 
     full_model_name = f"{current_date}_{model_name}"
 
     # Check if folder already exists with this name
     if os.path.isdir(f"trained_models/{full_model_name}"):
-        print('Folder with this name already exists please try another')
+        print("Folder with this name already exists please try another")
     else:
         unique_name = True
-        
+
 
 # Make directory with current data and model name
 try:
@@ -115,7 +160,7 @@
 
 # Run script with given input using python in the venv (so venv does not need to be activated beforehand)
 print("\nRunning command:")
-if sys.platform == 'win32':
+if sys.platform == "win32":
     command = f".ml2sql\Scripts\python.exe scripts/main.py --name trained_models/{full_model_name} --data_path {csv_path} --configuration {json_path} --model {model_type}"
 else:
     command = f".ml2sql/bin/python scripts/main.py --name trained_models/{full_model_name} --data_path {csv_path} --configuration {json_path} --model {model_type}"
@@ -125,4 +170,4 @@
 os.system(command)
 
 print("\nModel outputs can be found in folder:")
-print(f"{os.getcwd()}/trained_models/{full_model_name}")
\ No newline at end of file
+print(f"{os.getcwd()}/trained_models/{full_model_name}")
diff --git a/scripts/__init__.py b/scripts/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/scripts/create_config.py b/scripts/create_config.py
index 88eed5a..adf7604 100644
--- a/scripts/create_config.py
+++ b/scripts/create_config.py
@@ -1,6 +1,12 @@
 import csv
+import pandas as pd
+from pandas.api.types import is_numeric_dtype
+from pandas.api.types import is_object_dtype
 import json
 import os
+from utils.helper_functions.config_handling import select_ml_cols
+from utils.helper_functions.parsing_arguments import GetArgs
+
 
 def get_input(options, message):
     print(f"\n{message}")
@@ -15,167 +21,218 @@ def get_input(options, message):
             print("Invalid option, try again.")
     return choice
 
-# List files in input/data/ directory
-data_dir = "input/data/"
-files = os.listdir(data_dir)
-
-print("Files in input/data/:")
-for i, file in enumerate(files, 1):
-    print(f"{i}. {file}")
-
-# Ask for CSVPATH
-csv_path = None
-while csv_path is None:
-    csv_file_index = input("\nSelect path to csv file to create config for: ")
-    try:
-        csv_file_index = int(csv_file_index) - 1
-        csv_path = os.path.join(data_dir, files[csv_file_index])
-    except (ValueError, IndexError):
-        print("Invalid option, try again.")
-
-print(f"CSV file {csv_path} will be used to create a config file for")
-
-# Load the example CSV file
-with open(csv_path) as f:
-    reader = csv.reader(f)
-    headers = next(reader)
-
-# Create a dictionary to store the features and their indices
-features_dict = {}
-for i, header in enumerate(headers):
-    features_dict[i] = header
-
-# Ask the user to choose a target
-print("Which column would you like to use as the target?")
-for i, header in features_dict.items():
-    print(f"{i}. {header}")
-target = int(input("Enter the index of the target column: "))
-
-# Remove the target from the list of features
-target_column = features_dict.pop(target)
-
-# Initialize the selected features
-selected_features = []
-
-# Main loop to prompt the user for feature selection
-while True:
-    print("\nFeatures:")
+def create_config(args):
+    # Load in data
+    csv_path = args.data_path
+    data = pd.read_csv(
+        args.data_path, keep_default_na=False, nrows=500, na_values=["", "N/A", "NULL"]
+    )
+
+    # Create a dictionary to store the features and their indices
+    features_dict = {}
+    for i, header in enumerate(data.columns):
+        features_dict[i] = header
+
+    # Ask the user to choose a target
+    print("Which column would you like to use as the target?")
     for i, header in features_dict.items():
-        if i in selected_features:
-            print(f"{i}: {header} (selected)")
-        else:
-            print(f"{i}: {header}")
-    print("\nSelect features:")
-    print("1. Choose a feature by index")
-    print("2. Deselect a feature by index")
-    print("3. Select all features")
-    print("4. Deselect all features")
-    print("5. Done")
-    choice = input("Enter your choice (1-5): ")
-
-    # Check the user's choice
-    if choice == "1":
-        index = int(input("Enter the index of the feature you want to select: "))
-        if index in features_dict.keys() and index not in selected_features:
-            selected_features.append(index)
-    elif choice == "2":
-        index = int(input("Enter the index of the feature you want to deselect: "))
-        if index in selected_features:
-            selected_features.remove(index)
-    elif choice == "3":
-        selected_features = list(features_dict.keys())
-    elif choice == "4":
+        print(f"{i}. {header}")
+    target = int(input("Enter the index of the target column: "))
+
+    # Remove the target from the list of features
+    target_column = features_dict.pop(target)
+
+    config_creation = get_input(
+        ["Manual", "Automatic"], "Do you want to create config manually or automatically?"
+    )
+    print(config_creation)
+
+    if config_creation == "Automatic":
+        ## Call other script (mainly to not have to execute this script with an active venv)
+        # Filter out features which are ID's (all values are unique) and dates
+        features_set = select_ml_cols(data)
+        features_set.discard(target_column)
+
+        input_params = {
+            "features": list(features_set),
+            "model_params": {},
+            "post_params": {
+                "calibration": "false",
+                "sql_split": "true",
+                "file_type": "html",
+            },
+            "pre_params": {
+                "cv_type": "notimeseriesplit",
+                "max_rows": 10000,
+                "time_sensitive_column": "_",
+                "upsampling": "false",
+            },
+            "target": target_column,
+        }
+
+        csv_file_name = csv_path.split('/')[-1].split('.')[0]
+        config_name = f'{csv_file_name}_auto_config'
+
+    elif config_creation == "Manual":
+        ## Original way of creating config
+
+        # Initialize the selected features
         selected_features = []
-    elif choice == "5":
-        break
-    else:
-        print("Invalid choice. Please try again.")
-
-# Create the features list from the selected features indices
-features = [features_dict[i] for i in selected_features]
-
-# Non used columns
-[features_dict.pop(i) for i in selected_features]
-
-# Fill in the JSON template with the selected features
-input_params = {
-  "features": features,
-  "model_params": {
-  },
-  "post_params": {
-    "calibration": "false",
-    "sql_split": "true",
-    "file_type": "html"
-  },
-  "pre_params": {
-    "cv_type": "notimeseriesplit",
-    "max_rows": 100000,
-    "time_sensitive_column": "date_column",
-    "upsampling": "false"
-  },
-  "target": target_column
-}
-
-# Ask the user to input the value for each key in input_params
-print("\nLet's fill in the rest of the JSON file together!\n")
-
-for key in input_params:
-    if key in ["features", "target"]:
-        continue
-    elif key == "model_params":
-        input_value = input("Do you have any specific model parameters to set? (yes/no): ")
-        if input_value.lower() == "yes":
-            model_params = {}
-            model_params_keys = input("Enter the key for each model parameter, separated by comma: ").split(',')
-            model_params_values = input("Enter the value for each model parameter, separated by comma: ").split(',')
-            for i in range(len(model_params_keys)):
-                model_params[model_params_keys[i].strip()] = model_params_values[i].strip()
-            input_params[key] = model_params
-        else:
-            print("No model parameters were set.\n")
-    else:
-        if len(input_params[key]) > 1:
-            for key2 in input_params[key]:
-                if key2 == 'calibration':
-                    # input_value = get_input(["true","false"], "Calibration (true/false): ")
-                    input_value = "false"
-                elif key2 == 'sql_split':
-                    input_value = get_input(["true","false"], "SQL split (true/false): ")
-                elif key2 == 'file_type':
-                    input_value = get_input(["html","png"], "File type (html/png): ")
-                elif key2 == 'cv_type':
-                    input_value = get_input(["timeseriessplit","kfold"], "CV type (timeseriessplit/kfold): ")
-                elif key2 == 'max_rows':
-                    input_value = int(input("\nMax rows (number): "))
-                elif key2 == 'time_sensitive_column':
-                    if input_params['pre_params']['cv_type'] == 'timeseriessplit':
-                        if len(features_dict) == 0:
-                            print('No columns to select as time sensitive, switching to kfold')
-                            input_params['pre_params']['cv_type'] = 'kfold'
-                        print("\nWhich column would you like to use as the time sensitive column?")
-                        for i, header in features_dict.items():
-                            print(f"{i}. {header}")
-                        date_col_index = int(input("Enter the index of the time sensitive column: "))
-                        input_value = features_dict[date_col_index]
-                    else:
-                        input_value = '_'
-                elif key2 == 'upsampling':
-                    # input_value = get_input(["true","false"], "Upsampling (true/false): ")
-                    input_value = "false"
-                
-                # Fill in value in dict
-                input_params[key][key2] = input_value
-
-# convert the dictionary to a JSON string
-json_string = json.dumps(input_params, indent=4)
-
-# name config file
-config_name = input("\nName config file:")
-config_name = config_name.split(".")[0]
-
-# write the JSON string to a file
-with open(f"input/configuration/{config_name}.json", "w") as file:
-    file.write(json_string)
-
-# Print the resulting JSON
-print(json_string)
\ No newline at end of file
+
+        # Main loop to prompt the user for feature selection
+        while True:
+            print("\nFeatures:")
+            for i, header in features_dict.items():
+                if i in selected_features:
+                    print(f"{i}: {header} (selected)")
+                else:
+                    print(f"{i}: {header}")
+            print("\nSelect features:")
+            print("1. Choose a feature by index")
+            print("2. Deselect a feature by index")
+            print("3. Select all features")
+            print("4. Deselect all features")
+            print("5. Done")
+            choice = input("Enter your choice (1-5): ")
+
+            # Check the user's choice
+            if choice == "1":
+                index = int(input("Enter the index of the feature you want to select: "))
+                if index in features_dict.keys() and index not in selected_features:
+                    selected_features.append(index)
+            elif choice == "2":
+                index = int(input("Enter the index of the feature you want to deselect: "))
+                if index in selected_features:
+                    selected_features.remove(index)
+            elif choice == "3":
+                selected_features = list(features_dict.keys())
+            elif choice == "4":
+                selected_features = []
+            elif choice == "5":
+                break
+            else:
+                print("Invalid choice. Please try again.")
+
+        # Create the features list from the selected features indices
+        features = [features_dict[i] for i in selected_features]
+
+        # Non used columns
+        [features_dict.pop(i) for i in selected_features]
+
+        # Fill in the JSON template with the selected features
+        input_params = {
+            "features": features,
+            "model_params": {},
+            "post_params": {
+                "calibration": "false",
+                "sql_split": "true",
+                "file_type": "html",
+            },
+            "pre_params": {
+                "cv_type": "notimeseriesplit",
+                "max_rows": 100000,
+                "time_sensitive_column": "date_column",
+                "upsampling": "false",
+            },
+            "target": target_column,
+        }
+
+        # Ask the user to input the value for each key in input_params
+        print("\nLet's fill in the rest of the JSON file together!\n")
+
+        for key in input_params:
+            if key in ["features", "target"]:
+                continue
+            elif key == "model_params":
+                input_value = input(
+                    "Do you have any specific model parameters to set? (yes/no): "
+                )
+                if input_value.lower() == "yes":
+                    model_params = {}
+                    model_params_keys = input(
+                        "Enter the key for each model parameter, separated by comma: "
+                    ).split(",")
+                    model_params_values = input(
+                        "Enter the value for each model parameter, separated by comma: "
+                    ).split(",")
+                    for i in range(len(model_params_keys)):
+                        model_params[model_params_keys[i].strip()] = model_params_values[
+                            i
+                        ].strip()
+                    input_params[key] = model_params
+                else:
+                    print("No model parameters were set.\n")
+            else:
+                if len(input_params[key]) > 1:
+                    for key2 in input_params[key]:
+                        if key2 == "calibration":
+                            # input_value = get_input(["true","false"], "Calibration (true/false): ")
+                            input_value = "false"
+                        elif key2 == "sql_split":
+                            input_value = get_input(
+                                ["true", "false"], "SQL split (true/false): "
+                            )
+                        elif key2 == "file_type":
+                            input_value = get_input(
+                                ["html", "png"], "File type (html/png): "
+                            )
+                        elif key2 == "cv_type":
+                            input_value = get_input(
+                                ["timeseriessplit", "kfold"],
+                                "CV type (timeseriessplit/kfold): ",
+                            )
+                        elif key2 == "max_rows":
+                            input_value = int(input("\nMax rows (number): "))
+                        elif key2 == "time_sensitive_column":
+                            if input_params["pre_params"]["cv_type"] == "timeseriessplit":
+                                if len(features_dict) == 0:
+                                    print(
+                                        "No columns to select as time sensitive, switching to kfold"
+                                    )
+                                    input_params["pre_params"]["cv_type"] = "kfold"
+                                print(
+                                    "\nWhich column would you like to use as the time sensitive column?"
+                                )
+                                for i, header in features_dict.items():
+                                    print(f"{i}. {header}")
+                                date_col_index = int(
+                                    input("Enter the index of the time sensitive column: ")
+                                )
+                                input_value = features_dict[date_col_index]
+                            else:
+                                input_value = "_"
+                        elif key2 == "upsampling":
+                            # input_value = get_input(["true","false"], "Upsampling (true/false): ")
+                            input_value = "false"
+
+                        # Fill in value in dict
+                        input_params[key][key2] = input_value
+
+        # name config file
+        config_name = input("\nName config file:")
+        config_name = config_name.split(".")[0]
+
+    # convert the dictionary to a JSON string
+    json_string = json.dumps(input_params, indent=4)
+
+    # Create path to save config file to
+    config_path = f"input/configuration/{config_name}.json"
+
+    # write the JSON string to a file
+    with open(config_path, "w") as file:
+        file.write(json_string)
+
+    # Print the resulting JSON
+    print(json_string)
+
+    # print path
+    print(f'Config saved in: {config_path}')
+
+    return config_path
+
+if __name__ == '__main__':
+    # Get arguments from the CLI
+    args = GetArgs("create_config", None)
+
+    # Run main with given arguments
+    create_config(args)
diff --git a/scripts/main.py b/scripts/main.py
index 864cde0..ccfd23c 100644
--- a/scripts/main.py
+++ b/scripts/main.py
@@ -2,14 +2,16 @@
 import logging
 import pandas as pd
 import json
+import sys
 
 # Main modelling function
 from utils.modelling.main_modeler import make_model
 
 # The translations to SQL (grey as we refer to them dynamically)
-from utils.output_scripts import decision_tree_as_code
-from utils.output_scripts import decision_rule_as_code
-from utils.output_scripts import ebm_as_code
+from utils.output_scripts import decision_tree_as_code  # noqa: F401
+from utils.output_scripts import decision_rule_as_code  # noqa: F401
+from utils.output_scripts import ebm_as_code  # noqa: F401
+from utils.output_scripts import l_regression_as_code  # noqa: F401
 
 from utils.helper_functions.checks import checkInputDataHard
 
@@ -17,17 +19,29 @@
 from utils.helper_functions.parsing_arguments import GetArgs
 from utils.pre_processing.pre_process import pre_process_kfold
 
+
 def main(args):
     # get given name from the first given argument
     given_name = args.name
 
     # set logger
-    logging.basicConfig(format='%(asctime)s %(message)s', filename=given_name+'/logging.log', level=logging.DEBUG)
-    logging.getLogger('matplotlib.font_manager').disabled = True # ignore matplotlibs font warnings
-    logging.info(f'Script input arguments: \n{args}')
+    logging.basicConfig(
+        level=logging.DEBUG,
+        format="%(asctime)s [%(levelname)s] %(message)s",
+        handlers=[
+            logging.FileHandler(given_name + "/logging.log"),
+            logging.StreamHandler(),
+        ],
+    )
+    logging.getLogger(
+        "matplotlib.font_manager"
+    ).disabled = True  # ignore matplotlibs font warnings
+    logging.info(f"Script input arguments: \n{args}")
 
     # Load in data
-    data = pd.read_csv(args.data_path)
+    data = pd.read_csv(
+        args.data_path, keep_default_na=False, na_values=["", "N/A", "NULL"]
+    )
 
     # Get configuration file
     with open(args.configuration) as json_file:
@@ -37,49 +51,73 @@ def main(args):
     model_name = args.model_name
 
     # Handle the configuration file
-    target_col, feature_cols, model_params, pre_params, post_params = config_handling(configuration, logging)
+    target_col, feature_cols, model_params, pre_params, post_params = config_handling(
+        configuration, data, logging
+    )
 
     # Log parameters
-    logging.info(f'Configuration file content: \n{configuration}')
+    logging.info(f"Configuration file content: \n{configuration}")
 
     # Perform some basic checks
     checkInputDataHard(data, configuration)
 
     # set model type based on target value
-    if (data[target_col].dtype == 'float') | ((data[target_col].dtype == 'int') & (data[target_col].nunique() > 10)):
-        model_type = 'regression'
+    if (data[target_col].dtype == "float") | (
+        (data[target_col].dtype == "int") & (data[target_col].nunique() > 10)
+    ):
+        model_type = "regression"
     else:
-        model_type = 'classification'
+        model_type = "classification"
 
-        print(f'\nTarget column has {data[target_col].nunique()} unique values')
-        logging.info(f'\nTarget column has {data[target_col].nunique()} unique values')
+        logging.info(f"Target column has {data[target_col].nunique()} unique values")
 
-    print('\nThis problem will be treated as a {model_type} problem'.format(model_type=model_type))
-    logging.info('This problem will be treated as a {model_type} problem'.format(model_type=model_type))
+    logging.info(
+        "This problem will be treated as a {model_type} problem".format(
+            model_type=model_type
+        )
+    )
 
     # pre process data
-    datasets = pre_process_kfold(given_name, data, target_col, feature_cols
-                                                 , model_name=model_name
-                                                 , model_type=model_type
-                                                 , logging=logging
-                                                 , pre_params=pre_params
-                                                 , post_params=post_params
-                                                 , random_seed=random_seed)
+    datasets = pre_process_kfold(
+        given_name,
+        data,
+        target_col,
+        feature_cols,
+        model_name=model_name,
+        model_type=model_type,
+        logging=logging,
+        pre_params=pre_params,
+        post_params=post_params,
+        random_seed=random_seed,
+    )
 
     # train decision tree and figures and save them
-    clf = make_model(given_name, datasets, model_name=model_name, model_type=model_type, model_params=model_params, post_params=post_params, logging=logging)
+    clf = make_model(
+        given_name,
+        datasets,
+        model_name=model_name,
+        model_type=model_type,
+        model_params=model_params,
+        post_params=post_params,
+        logging=logging,
+    )
 
     # Create SQL version of model and save it
-    globals()[model_name + '_as_code'].save_model_and_extras(clf, given_name, post_params['sql_split'], logging)
+    globals()[model_name + "_as_code"].save_model_and_extras(
+        clf, given_name, post_params["sql_split"], logging
+    )
 
-# Run function
-if __name__ == '__main__':
+    # Exit with code 0 for success
+    sys.exit(0)  
 
-    set_env = 'prod' # either prod or dev
+
+# Run function
+if __name__ == "__main__":
+    set_env = "prod"  # either prod or dev
 
     # Check if this script is run from terminal
-    if set_env == 'prod':
-        print('from terminal')
+    if set_env == "prod":
+        print("from terminal")
         # (Prod) script is being run through the terminal
         argvals = None
     else:
@@ -87,20 +125,22 @@ def main(args):
         # make sure pwd is the root folder (not in scripts)
 
         # Command line arguments used for testing
-        argvals = '--name ../trained_models/test ' \
-                  '--data_path ../input/data/20230912_fc_predict_casenums_v123.csv ' \
-                  '--configuration ../input/configuration/fc_casenum_0.json ' \
-                  '--model ebm'.split() # example of passing test params to parser
+        argvals = (
+            "--name ../trained_models/test "
+            "--data_path ../input/data/example_binary_titanic.csv "
+            "--configuration ../input/configuration/example_binary_titanic.json "
+            "--model ebm".split()
+        )  # example of passing test params to parser
 
         # settings
-        pd.set_option('display.max_rows', 500)
-        pd.set_option('display.max_columns', 10)
+        pd.set_option("display.max_rows", 500)
+        pd.set_option("display.max_columns", 10)
 
     # Set random seed
     random_seed = 42
 
     # Get arguments from the CLI
-    args = GetArgs('main', argvals)
+    args = GetArgs("main", argvals)
 
     # Run main with given arguments
     main(args)
\ No newline at end of file
diff --git a/scripts/setup.py b/scripts/setup.py
index d938a0b..8740d30 100644
--- a/scripts/setup.py
+++ b/scripts/setup.py
@@ -13,7 +13,7 @@
     subprocess.run(["python3", "-m", "venv", VENV_NAME])
 
 # Install packages in virtual environment
-print(f"Installing packages in virtual environment...")
+print("Installing packages in virtual environment...")
 if sys.platform.startswith("win"):
     install_packages = os.path.join(VENV_NAME, "Scripts", "pip")
 else:
@@ -21,4 +21,4 @@
 
 subprocess.run([f"{install_packages}", "install", "-r", "requirements.txt"])
 
-print("Virtual environment created and packages installed successfully.")
\ No newline at end of file
+print("Virtual environment created and packages installed successfully.")
diff --git a/scripts/utils/feature_selection/correlations.py b/scripts/utils/feature_selection/correlations.py
index e48cd4e..ac204b6 100644
--- a/scripts/utils/feature_selection/correlations.py
+++ b/scripts/utils/feature_selection/correlations.py
@@ -25,24 +25,24 @@ def plotClustermap(dfc, matrix_type, given_name, file_type, logging):
     labels = dfc.columns
 
     # Initialize figure by creating upper dendrogram
-    fig = ff.create_dendrogram(dfc, orientation='bottom', labels=labels)
-    for i in range(len(fig['data'])):
-        fig['data'][i]['yaxis'] = 'y2'
+    fig = ff.create_dendrogram(dfc, orientation="bottom", labels=labels)
+    for i in range(len(fig["data"])):
+        fig["data"][i]["yaxis"] = "y2"
 
     # Create Side Dendrogram
-    dendro_side = ff.create_dendrogram(dfc, orientation='right', labels=labels)
-    for i in range(len(dendro_side['data'])):
-        dendro_side['data'][i]['xaxis'] = 'x2'
+    dendro_side = ff.create_dendrogram(dfc, orientation="right", labels=labels)
+    for i in range(len(dendro_side["data"])):
+        dendro_side["data"][i]["xaxis"] = "x2"
 
     # Add Side Dendrogram Data to Figure
-    for data in dendro_side['data']:
+    for data in dendro_side["data"]:
         fig.add_trace(data)
 
     # Create Heatmap
-    dendro_leaves = dendro_side['layout']['yaxis']['ticktext']
+    dendro_leaves = dendro_side["layout"]["yaxis"]["ticktext"]
 
-    heat_data = dfc.loc[dendro_leaves,:]
-    heat_data = heat_data.loc[:,dendro_leaves]
+    heat_data = dfc.loc[dendro_leaves, :]
+    heat_data = heat_data.loc[:, dendro_leaves]
 
     x = dendro_leaves
     y = dendro_leaves
@@ -53,70 +53,87 @@ def plotClustermap(dfc, matrix_type, given_name, file_type, logging):
     for yi, yy in enumerate(y):
         hovertext.append(list())
         for xi, xx in enumerate(x):
-            hovertext[-1].append('x: {}<br />y: {}<br />corr.: {}'.format(xx, yy, z[yy][xx]))
+            hovertext[-1].append(
+                "x: {}<br />y: {}<br />corr.: {}".format(xx, yy, z[yy][xx])
+            )
 
     heatmap = [
         go.Heatmap(
-            x = x,
-            y = y,
-            z = z,
-            colorscale = 'Blues',
-            hoverinfo = 'text',
-            hovertext = hovertext
+            x=x, y=y, z=z, colorscale="Blues", hoverinfo="text", hovertext=hovertext
         )
     ]
 
-    heatmap[0]['x'] = fig['layout']['xaxis']['tickvals']
-    heatmap[0]['y'] = dendro_side['layout']['yaxis']['tickvals']
+    heatmap[0]["x"] = fig["layout"]["xaxis"]["tickvals"]
+    heatmap[0]["y"] = dendro_side["layout"]["yaxis"]["tickvals"]
 
     # Add Heatmap Data to Figure
     for data in heatmap:
         fig.add_trace(data)
 
     # Edit Layout
-    fig.update_layout({'width':1200, 'height':1200,
-                             'showlegend':False,
-                            'hovermode': 'closest',
-                             })
+    fig.update_layout(
+        {
+            "width": 1200,
+            "height": 1200,
+            "showlegend": False,
+            "hovermode": "closest",
+        }
+    )
     # Edit xaxis
-    fig.update_layout(xaxis={'domain': [.15, 1],
-                                      'mirror': False,
-                                      'showgrid': False,
-                                      'showline': False,
-                                      'zeroline': False,
-                                      'ticks':""})
+    fig.update_layout(
+        xaxis={
+            "domain": [0.15, 1],
+            "mirror": False,
+            "showgrid": False,
+            "showline": False,
+            "zeroline": False,
+            "ticks": "",
+        }
+    )
     # Edit xaxis2
-    fig.update_layout(xaxis2={'domain': [0, .15],
-                                       'mirror': False,
-                                       'showgrid': False,
-                                       'showline': False,
-                                       'zeroline': False,
-                                       'showticklabels': False,
-                                       'ticks':""})
+    fig.update_layout(
+        xaxis2={
+            "domain": [0, 0.15],
+            "mirror": False,
+            "showgrid": False,
+            "showline": False,
+            "zeroline": False,
+            "showticklabels": False,
+            "ticks": "",
+        }
+    )
 
     # Edit yaxis
-    fig.update_layout(yaxis={'domain': [0, .85],
-                                      'mirror': False,
-                                      'showgrid': False,
-                                      'showline': False,
-                                      'zeroline': False,
-                                      'showticklabels': False,
-                                      'ticks': ""
-                            })
+    fig.update_layout(
+        yaxis={
+            "domain": [0, 0.85],
+            "mirror": False,
+            "showgrid": False,
+            "showline": False,
+            "zeroline": False,
+            "showticklabels": False,
+            "ticks": "",
+        }
+    )
     # Edit yaxis2
-    fig.update_layout(yaxis2={'domain':[.825, .975],
-                                       'mirror': False,
-                                       'showgrid': False,
-                                       'showline': False,
-                                       'zeroline': False,
-                                       'showticklabels': False,
-                                       'ticks':""})
-
-    if file_type == 'png':
-        fig.write_image(f'{given_name}/feature_info/{matrix_type}_clustermap.png')
-    elif file_type == 'html':
+    fig.update_layout(
+        yaxis2={
+            "domain": [0.825, 0.975],
+            "mirror": False,
+            "showgrid": False,
+            "showline": False,
+            "zeroline": False,
+            "showticklabels": False,
+            "ticks": "",
+        }
+    )
+
+    if file_type == "png":
+        fig.write_image(f"{given_name}/feature_info/{matrix_type}_clustermap.png")
+    elif file_type == "html":
         # or as html file
-        fig.write_html(f'{given_name}/feature_info/{matrix_type}_clustermap.html')
+        fig.write_html(f"{given_name}/feature_info/{matrix_type}_clustermap.html")
+
 
 def plotPearsonCorrelation(df, given_name, file_type, logging):
     """
@@ -138,26 +155,27 @@ def plotPearsonCorrelation(df, given_name, file_type, logging):
     """
     # Numerical values
     # Creating pearson correlation matrix
-    data_ = df.select_dtypes(exclude=['object', 'category', 'bool']).copy()
+    data_ = df.select_dtypes(exclude=["object", "category", "bool"]).copy()
 
     # if above dataframe is empty then skip function
     if data_.empty:
-        print(f'No numerical variables found')
-        logging.info(f'No numerical variables found')
+        logging.info("No numerical variables found")
+        return
+    elif data_.shape[1] == 1:
+        logging.info("Skip Pearson correlation matrix due to fewer than 2 numerical variables found")
         return
 
     data_corr = data_.corr()
     data_corr.fillna(0, inplace=True)
-    data_corr = np.clip(data_corr, -1 , 1)
+    data_corr = np.clip(data_corr, -1, 1)
 
-    matrix_type = 'numeric'
+    matrix_type = "numeric"
 
     # Plot matrix
     plotClustermap(data_corr, matrix_type, given_name, file_type, logging)
 
     # success message
-    print(f'Created Pearson correlation matrix (for numerical features)')
-    logging.info(f'Created Pearson correlation matrix (for numerical features)')
+    logging.info("Created Pearson correlation matrix (for numerical features)")
 
 
 def cramers_corrected_stat(confusion_matrix):
@@ -181,12 +199,13 @@ def cramers_corrected_stat(confusion_matrix):
     """
     chi2 = ss.chi2_contingency(confusion_matrix)[0]
     n = confusion_matrix.to_numpy().sum()
-    phi2 = chi2/n
-    r,k = confusion_matrix.shape
-    phi2corr = max(0, phi2 - ((k-1)*(r-1))/(n-1))
-    rcorr = r - ((r-1)**2)/(n-1)
-    kcorr = k - ((k-1)**2)/(n-1)
-    return np.sqrt(phi2corr / min( (kcorr-1), (rcorr-1)))
+    phi2 = chi2 / n
+    r, k = confusion_matrix.shape
+    phi2corr = max(0, phi2 - ((k - 1) * (r - 1)) / (n - 1))
+    rcorr = r - ((r - 1) ** 2) / (n - 1)
+    kcorr = k - ((k - 1) ** 2) / (n - 1)
+    return np.sqrt(phi2corr / min((kcorr - 1), (rcorr - 1)))
+
 
 def plotCramervCorrelation(df, given_name, file_type, logging):
     """
@@ -213,24 +232,25 @@ def plotCramervCorrelation(df, given_name, file_type, logging):
 
     Notes:
     ------
-    This function computes the Cramer's V correlation matrix for the categorical variables in the input dataframe. 
+    This function computes the Cramer's V correlation matrix for the categorical variables in the input dataframe.
     If the dataframe does not have at least two categorical variables, the function will skip the computation and return.
-    The correlation matrix is plotted using the seaborn clustermap function, which creates a heatmap of the correlation 
+    The correlation matrix is plotted using the seaborn clustermap function, which creates a heatmap of the correlation
     matrix, and performs hierarchical clustering of the variables.
 
     References:
     -----------
-    - Bergsma, W., & Wicher, M. (2013). 
+    - Bergsma, W., & Wicher, M. (2013).
       Journal of the Korean Statistical Society, 42(3), 323-328.
     """
     # Nominal Categorical values
     # Creating CramerV correlation matrix
-    data_ = df.select_dtypes(include=['category', 'object', 'bool']).copy()
+    data_ = df.select_dtypes(include=["category", "object", "bool"]).copy()
 
     # if above dataframe is empty then skip function
     if data_.shape[1] < 2:
-        print(f'Skip CramerV correlation matrix due to fewer than 2 categorical variables found')
-        logging.info(f'Skip CramerV correlation matrix due to fewer than 2 categorical variables found')
+        logging.info(
+            "Skip CramerV correlation matrix due to fewer than 2 categorical variables found"
+        )
         return
 
     cols = data_.columns
@@ -243,21 +263,20 @@ def plotCramervCorrelation(df, given_name, file_type, logging):
                 cm = pd.crosstab(data_[i], data_[j])
                 cramervcorr = cramers_corrected_stat(cm)
 
-            df_cramerv.at[i,j] = cramervcorr
+            df_cramerv.at[i, j] = cramervcorr
 
     # Clean up values
     df_cramerv.fillna(0, inplace=True)
     df_cramerv = np.clip(df_cramerv, 0, 1)
 
     # cast matrix content to float
-    df_cramerv=df_cramerv.astype(float)
+    df_cramerv = df_cramerv.astype(float)
 
     # set matrix data type
-    matrix_type = 'categorical'
+    matrix_type = "categorical"
 
     # Plot matrix
     plotClustermap(df_cramerv, matrix_type, given_name, file_type, logging)
 
     # Success message
-    print(f'Created CramerV correlation matrix (for categorical values)')
-    logging.info(f'Created CramerV correlation matrix (for categorical values)')
+    logging.info("Created CramerV correlation matrix (for categorical values)")
diff --git a/scripts/utils/helper_functions/checks.py b/scripts/utils/helper_functions/checks.py
index 2fd4e2e..226e316 100644
--- a/scripts/utils/helper_functions/checks.py
+++ b/scripts/utils/helper_functions/checks.py
@@ -1,4 +1,3 @@
-import pandas as pd
 import numpy as np
 
 
@@ -6,18 +5,21 @@ def checkTargetHard(target):
     if target.nunique() == 1:
         raise Exception("Target column needs more than 1 unique value")
 
+
 def checkFeaturesHard(features):
     featNullCount = features.isnull().sum()
     nullf = featNullCount[featNullCount > 0]
     if len(nullf) > 0:
         raise Exception(f"NULL values not allowed, found the following: \n{nullf}")
 
+
 def checkInputDataHard(data, config):
     """
     Checks at start ensuring target and feature columns are good to go
     """
-    checkTargetHard(data[config['target']])
-    checkFeaturesHard(data[config['features']])
+    checkTargetHard(data[config["target"]])
+    checkFeaturesHard(data[config["features"]])
+
 
 def checkAllClassesHaveLeafNode(clf):
     """
@@ -36,8 +38,8 @@ def checkAllClassesHaveLeafNode(clf):
     n_nodes = clf.tree_.node_count
     children_left = clf.tree_.children_left
     children_right = clf.tree_.children_right
-    feature = clf.tree_.feature
-    threshold = clf.tree_.threshold
+    # feature = clf.tree_.feature
+    # threshold = clf.tree_.threshold
     class_values = clf.tree_.value
     classes = clf.classes_
 
@@ -45,16 +47,22 @@ def checkAllClassesHaveLeafNode(clf):
 
     for node_id in range(n_nodes):
         if children_left[node_id] == children_right[node_id]:
-            feature_index = feature[node_id]
+            # feature_index = feature[node_id]
             class_name = clf.classes_[np.argmax(class_values[node_id])]
             end_leaf_classes.append(class_name)
 
     if len(set(end_leaf_classes)) == len(classes):
-        print('All classes are represented by a leaf node\n')
+        print("All classes are represented by a leaf node\n")
 
         return True
     else:
-        print('{}/{} classes are represented by a leaf node ({})'.format(len(set(end_leaf_classes)),len(clf.classes_),len(end_leaf_classes)))
-        print('Missing class(es): {}\n'.format(set(clf.classes_) - set(end_leaf_classes)))
+        print(
+            "{}/{} classes are represented by a leaf node ({})".format(
+                len(set(end_leaf_classes)), len(clf.classes_), len(end_leaf_classes)
+            )
+        )
+        print(
+            "Missing class(es): {}\n".format(set(clf.classes_) - set(end_leaf_classes))
+        )
 
         return False
diff --git a/scripts/utils/helper_functions/config_handling.py b/scripts/utils/helper_functions/config_handling.py
index a00797e..a5892f3 100644
--- a/scripts/utils/helper_functions/config_handling.py
+++ b/scripts/utils/helper_functions/config_handling.py
@@ -1,13 +1,14 @@
-# Handle the configuration file
+import pandas as pd
 
-def config_handling(configuration, logging):
+# Handle the configuration file
+def config_handling(configuration, data, logging):
     """
     Handles the configuration file and extracts necessary information.
 
     Parameters:
     -----------
     configuration : dict
-        A dictionary containing configuration information such as target column, features columns, 
+        A dictionary containing configuration information such as target column, features columns,
         model related parameters, pre processing related parameters, and post modeling related parameters.
 
     logging : logger object
@@ -29,79 +30,151 @@ def config_handling(configuration, logging):
             A dictionary containing post modeling related parameters.
     """
     # target column
-    target_col = configuration['target']
+    target_col = configuration["target"]
 
     # features columns
-    if 'features' in configuration.keys():
-        feature_cols = configuration['features']
-        logging.info(f'{len(feature_cols)} features specified in file')
+    if "features" in configuration.keys():
+        feature_cols = configuration["features"]
+        logging.info(f"{len(feature_cols)} features specified in file")
     else:
         # treat all other columns as features
-        feature_cols = list(data_.columns)
+        feature_cols = list(data.columns)
         feature_cols.remove(target_col)
-        logging.info(f'Using {len(feature_cols)} features (all columns except target)')
+        logging.info(f"Using {len(feature_cols)} features (all columns except target)")
 
     # model related parameters
-    if 'model_params' in configuration.keys():
-        model_params = configuration['model_params']
+    if "model_params" in configuration.keys():
+        model_params = configuration["model_params"]
     else:
         model_params = {}
 
     # pre processing related parameters
-    if 'pre_params' in configuration.keys():
-        pre_params = configuration['pre_params']
+    if "pre_params" in configuration.keys():
+        pre_params = configuration["pre_params"]
     else:
         pre_params = {}
 
-    if not ('oot_set' in pre_params.keys()) & ('oot_rows' in pre_params.keys()):
-        pre_params['oot_set'] = 'false'
+    if not ("oot_set" in pre_params.keys()) & ("oot_rows" in pre_params.keys()):
+        pre_params["oot_set"] = "false"
 
     # Cross validation type to perform
-    if 'cv_type' not in pre_params.keys():
-        pre_params['cv_type'] = 'kfold_cv'
+    if "cv_type" not in pre_params.keys():
+        pre_params["cv_type"] = "kfold_cv"
 
     # If not present set upsamplling to false
-    if 'upsampling' not in pre_params.keys():
-        pre_params['upsampling'] = 'false'
+    if "upsampling" not in pre_params.keys():
+        pre_params["upsampling"] = "false"
 
     # post modeling related parameters
-    if 'post_params' in configuration.keys():
-        post_params = configuration['post_params']
+    if "post_params" in configuration.keys():
+        post_params = configuration["post_params"]
     else:
         post_params = {}
 
     # # unpack calibration from params
-    if 'calibrate' in post_params.keys():
-        if post_params['calibration'] in ['auto','sigmoid','isotonic','true']:
-            post_params['calibration'] = 'auto' if post_params['calibration'] == 'true' else post_params['calibration']
+    if "calibrate" in post_params.keys():
+        if post_params["calibration"] in ["auto", "sigmoid", "isotonic", "true"]:
+            post_params["calibration"] = (
+                "auto"
+                if post_params["calibration"] == "true"
+                else post_params["calibration"]
+            )
         else:
-            post_params['calibration'] = 'false'
+            post_params["calibration"] = "false"
     else:
-        post_params['calibration'] = 'false'
+        post_params["calibration"] = "false"
 
     # If not present set calibration check if we upsample
-    if 'calibration' not in post_params.keys():
-        if pre_params['upsampling'] == 'true':
-            post_params['calibration'] = 'auto'
+    if "calibration" not in post_params.keys():
+        if pre_params["upsampling"] == "true":
+            post_params["calibration"] = "auto"
         else:
-            post_params['calibration'] = 'false'
+            post_params["calibration"] = "false"
 
     # If not present set split to false
-    if 'sql_split' in post_params.keys():
-        if post_params['sql_split'] == 'true':
-            post_params['sql_split'] = True
+    if "sql_split" in post_params.keys():
+        if post_params["sql_split"] == "true":
+            post_params["sql_split"] = True
         else:
-            post_params['sql_split'] = False
+            post_params["sql_split"] = False
     else:
-        post_params['sql_split'] = False
+        post_params["sql_split"] = False
 
     # If not present set file type to png
-    if 'file_type' in post_params.keys():
-        if post_params['file_type'].lower() == 'html':
-            post_params['file_type'] = 'html'
+    if "file_type" in post_params.keys():
+        if post_params["file_type"].lower() == "html":
+            post_params["file_type"] = "html"
         else:
-            post_params['file_type'] = 'png'
+            post_params["file_type"] = "png"
     else:
-        post_params['file_type'] = 'png'
+        post_params["file_type"] = "png"
 
     return target_col, feature_cols, model_params, pre_params, post_params
+
+def _get_col_dtype(col):
+        """
+        Sourced: https://stackoverflow.com/questions/35003138/python-pandas-inferring-column-datatypes
+        Infer datatype of a pandas column, process only if the column dtype is object. 
+        input:   col: a pandas Series representing a df column. 
+        """
+
+        if col.dtype == "object":
+            # try numeric
+            try:
+                col_new = pd.to_datetime(col.dropna().unique())
+                return col_new.dtype
+            except:
+                try:
+                    col_new = pd.to_numeric(col.dropna().unique())
+                    return col_new.dtype
+                except:
+                    try:
+                        col_new = pd.to_timedelta(col.dropna().unique())
+                        return col_new.dtype
+                    except:
+                        return "object"
+        else:
+            return col.dtype
+
+def select_ml_cols(df):
+    # Create a dictionary to store the features and their indices
+    features_set = set(df.columns)
+
+    print('Columns excluded for feature list:')
+
+    # Check uniqeness
+    for col in df.columns:
+        uniqueness_ratio = len(df[col].unique()) / len(df[col])
+        if uniqueness_ratio == 1:
+            features_set.discard(col)
+            print(f'"{col}" is an ID column')
+        
+        elif (uniqueness_ratio > 0.9) & (df[col].dtypes == 'int'):
+            features_set.discard(col)
+            print(f'"{col}" is int column with high cardinality')
+        
+        elif (uniqueness_ratio > 0.2) & (df[col].dtypes=='object'):
+            features_set.discard(col)
+            print(f'"{col}" is object column with high cardinality')
+        
+        elif (df[col].nunique() == 1):
+            features_set.discard(col)
+            print(f'"{col}" is column with only one value')
+
+    # Check column name
+    check_date_cols = ['date', 'dt']
+
+    for cdc in check_date_cols:
+        for col in df.columns:
+            if cdc in col.lower():
+                features_set.discard(col)
+                print(f'"{col}" is a date column')
+
+    for col in df.columns:
+        inferred_dtype = _get_col_dtype(df[col])
+        if all(ele not in str(inferred_dtype) for ele in ['object', 'string','int', 'float']):
+            features_set.discard(col)
+            print(f'"{col}" with datetype {inferred_dtype}')
+    
+    return features_set
+    
diff --git a/scripts/utils/helper_functions/parsing_arguments.py b/scripts/utils/helper_functions/parsing_arguments.py
index ac524ec..f6ad441 100644
--- a/scripts/utils/helper_functions/parsing_arguments.py
+++ b/scripts/utils/helper_functions/parsing_arguments.py
@@ -1,5 +1,6 @@
 import argparse
 
+
 def SetArgParser():
     """
     Create and configure an argument parser for command-line interface.
@@ -12,17 +13,37 @@ def SetArgParser():
     args = parser.parse_args()
     """
     parser = argparse.ArgumentParser()
-    parser.add_argument("--name", type=str, help="Enter project name",
-                        nargs='?', default='no_name', const='no_name')
-    parser.add_argument("--data_path", type=str, help="Enter path to csv file",
-                        nargs='?', default='no_data', const='no_data')
-    parser.add_argument("--configuration", type=str, help="Enter path to json file",
-                        nargs='?')
-    parser.add_argument("--model_name", type=str, help="Enter model type",
-                        nargs='?', default='decision_tree', const='full')
+    parser.add_argument(
+        "--name",
+        type=str,
+        help="Enter project name",
+        nargs="?",
+        default="no_name",
+        const="no_name",
+    )
+    parser.add_argument(
+        "--data_path",
+        type=str,
+        help="Enter path to csv file",
+        nargs="?",
+        default="no_data",
+        const="no_data",
+    )
+    parser.add_argument(
+        "--configuration", type=str, help="Enter path to json file", nargs="?"
+    )
+    parser.add_argument(
+        "--model_name",
+        type=str,
+        help="Enter model type",
+        nargs="?",
+        default="decision_tree",
+        const="full",
+    )
 
     return parser
 
+
 def GetArgs(script, argv):
     """
     Parse command-line arguments using argparse and return the parsed arguments.
@@ -41,24 +62,66 @@ def GetArgs(script, argv):
     """
     parser = argparse.ArgumentParser()
 
-    if script == 'main':
-      parser.add_argument("--name", type=str, help="Enter project name",
-                          nargs='?', default='no_name', const='no_name')
-      parser.add_argument("--data_path", type=str, help="Enter path to csv file",
-                          nargs='?', const='no_data')
-      parser.add_argument("--configuration", type=str, help="Enter path to json file",
-                          nargs='?', const='no_config')
-      parser.add_argument("--model_name", type=str, help="Enter model type",
-                          nargs='?', const='full')
-    
-    if script == 'test_model':
-      parser.add_argument("--model_path", type=str, help="Enter path to model",
-                          nargs='?', const='no_name')
-      parser.add_argument("--data_path", type=str, help="Enter path to csv file",
-                          nargs='?', const='no_data')
-      parser.add_argument("--destination_path", type=str, help="Enter path to folder for saving files",
-                          nargs='?', const='no_data')
+    if script == "main":
+        parser.add_argument(
+            "--name",
+            type=str,
+            help="Enter project name",
+            nargs="?",
+            default="no_name",
+            const="no_name",
+        )
+        parser.add_argument(
+            "--data_path",
+            type=str,
+            help="Enter path to csv file",
+            nargs="?",
+            const="no_data",
+        )
+        parser.add_argument(
+            "--configuration",
+            type=str,
+            help="Enter path to json file",
+            nargs="?",
+            const="no_config",
+        )
+        parser.add_argument(
+            "--model_name", type=str, help="Enter model type", nargs="?", const="full"
+        )
+
+    elif script == 'create_config':
+
+        parser.add_argument(
+            "--data_path",
+            type=str,
+            help="Enter path to csv file",
+            nargs="?",
+            const="no_data",
+        )
+        
+    elif script == "test_model":
+        parser.add_argument(
+            "--model_path",
+            type=str,
+            help="Enter path to model",
+            nargs="?",
+            const="no_name",
+        )
+        parser.add_argument(
+            "--data_path",
+            type=str,
+            help="Enter path to csv file",
+            nargs="?",
+            const="no_data",
+        )
+        parser.add_argument(
+            "--destination_path",
+            type=str,
+            help="Enter path to folder for saving files",
+            nargs="?",
+            const="no_data",
+        )
 
     args = parser.parse_args(argv)
 
-    return args
\ No newline at end of file
+    return args
diff --git a/scripts/utils/helper_functions/setup_logger.py b/scripts/utils/helper_functions/setup_logger.py
new file mode 100644
index 0000000..c8b97f4
--- /dev/null
+++ b/scripts/utils/helper_functions/setup_logger.py
@@ -0,0 +1,18 @@
+import logging
+import logging.handlers
+
+
+def setup_logger(log_file_path):
+    # Create a logger
+    logging.basicConfig(
+        level=logging.DEBUG,
+        format="%(asctime)s [%(levelname)s] %(message)s",
+        handlers=[logging.FileHandler(log_file_path), logging.StreamHandler()],
+    )
+
+    # disable certain matplotlib warnings
+    # logging.getLogger('matplotlib.font_manager').disabled = True # ignore matplotlibs font warnings
+
+    logger = logging.getLogger("matplotlib").setLevel(logging.ERROR)
+
+    return logger
diff --git a/scripts/utils/modelling/calibration.py b/scripts/utils/modelling/calibration.py
index da66814..a19f8c0 100644
--- a/scripts/utils/modelling/calibration.py
+++ b/scripts/utils/modelling/calibration.py
@@ -3,7 +3,8 @@
 from sklearn.isotonic import IsotonicRegression
 from sklearn.linear_model import LogisticRegression
 
-def calibrateModel(model, X, y, logging, method='auto', final_model=False):
+
+def calibrateModel(model, X, y, logging, method="auto", final_model=False):
     """
     Calibrate a classification model.
 
@@ -30,31 +31,30 @@ def calibrateModel(model, X, y, logging, method='auto', final_model=False):
         A calibration function. Returned only if `final_model` is True.
     """
     # set calibration function depending on calibration data size
-    if method == 'auto':
+    if method == "auto":
         if len(X) > 1000:
-            method = 'isotonic'
-            logging.info('Applying isotonic regression as calibration method')
+            method = "isotonic"
+            logging.info("Applying isotonic regression as calibration method")
         else:
-            method = 'sigmoid'
-            logging.info('Applying logistic regression as calibration method')
+            method = "sigmoid"
+            logging.info("Applying logistic regression as calibration method")
 
     if final_model:
-        if method == 'sigmoid':
-            y_pred = model.predict_proba(X)[:,1]
+        if method == "sigmoid":
+            y_pred = model.predict_proba(X)[:, 1]
             cal_reg = LogisticRegression().fit(y_pred.reshape(-1, 1), y)
 
-        elif method == 'isotonic':
-            y_pred = model.predict_proba(X)[:,1]
+        elif method == "isotonic":
+            y_pred = model.predict_proba(X)[:, 1]
             cal_reg = IsotonicRegression().fit(y_pred.reshape(-1, 1), y)
 
-    model_cal = CalibratedClassifierCV(base_estimator=model, method=method, cv='prefit')
+    model_cal = CalibratedClassifierCV(base_estimator=model, method=method, cv="prefit")
     model_cal.fit(X, y)
 
     # set attributes
     model_cal.feature_names = model.feature_names
 
-    print('Trained calibrated model')
-    logging.info('Trained calibrated model')
+    logging.info("Trained calibrated model")
 
     # plotCalibrationCurve(given_name='trained_models/20220303_henkie', y_true=y_test[part_id], y_prob=y_pred,
     #                      prediction_type='uncal', data_type='')
diff --git a/scripts/utils/modelling/main_modeler.py b/scripts/utils/modelling/main_modeler.py
index 2cd19ec..5549435 100644
--- a/scripts/utils/modelling/main_modeler.py
+++ b/scripts/utils/modelling/main_modeler.py
@@ -1,18 +1,21 @@
 import joblib
 import random
-import numpy as np 
+import numpy as np
 
 from sklearn.model_selection import train_test_split
-from utils.modelling.performance import *
-from utils.modelling.calibration import *
+from utils.modelling.performance import postModellingPlots
+from utils.modelling.calibration import calibrateModel
 
 # The actual algorithms (grey as we refer to them dynamically)
-from utils.modelling.models import ebm
-from utils.modelling.models import decision_rule
-from utils.modelling.models import decision_tree
-from utils.modelling.models import l_regression
+from utils.modelling.models import ebm  # noqa: F401
+from utils.modelling.models import decision_rule  # noqa: F401
+from utils.modelling.models import decision_tree  # noqa: F401
+from utils.modelling.models import l_regression  # noqa: F401
 
-def make_model(given_name, datasets, model_name, model_type, model_params, post_params, logging):
+
+def make_model(
+    given_name, datasets, model_name, model_type, model_params, post_params, logging
+):
     """
     Train and save a model, and generate performance plots.
 
@@ -39,115 +42,139 @@ def make_model(given_name, datasets, model_name, model_type, model_params, post_
 
     """
     # unpack datasets
-    X_train = datasets['cv_train']['X']
-    y_train = datasets['cv_train']['y']
-    X_test = datasets['cv_test']['X']
-    y_test = datasets['cv_test']['y']
-    X_all = datasets['final_train']['X']
-    y_all = datasets['final_train']['y']
-
+    X_train = datasets["cv_train"]["X"]
+    y_train = datasets["cv_train"]["y"]
+    X_test = datasets["cv_test"]["X"]
+    y_test = datasets["cv_test"]["y"]
+    X_all = datasets["final_train"]["X"]
+    y_all = datasets["final_train"]["y"]
 
     # check if X is a list (CV should be applied in that case)
     if isinstance(X_train, list):
-
         y_test_pred_list = list()
         y_test_prob_list = list()
 
         # Save all trained models in a dictionary
-        clf_dict = {'test': {}}
+        clf_dict = {"test": {}}
 
         for fold_id in range(len(X_train)):
-            print(f'Fold {fold_id} \nTrain model on test data')
-            logging.info(f'Fold {fold_id} \nTrain model on test data')
+            logging.info(f"Fold {fold_id} - Train model on test data")
 
             # Check if model needs to be calibrated
-            if post_params['calibration'] != 'false':
-                X_slice_train, X_cal, y_slice_train, y_cal = train_test_split(X_train[fold_id],y_train[fold_id], test_size=0.2,random_state=random.randint(0,100))
+            if post_params["calibration"] != "false":
+                X_slice_train, X_cal, y_slice_train, y_cal = train_test_split(
+                    X_train[fold_id],
+                    y_train[fold_id],
+                    test_size=0.2,
+                    random_state=random.randint(0, 100),
+                )
             else:
                 X_slice_train, y_slice_train = X_train[fold_id], y_train[fold_id]
 
             # Train the model
-            clf = globals()[model_name].trainModel(X_slice_train, y_slice_train, model_params, model_type, logging)
+            clf = globals()[model_name].trainModel(
+                X_slice_train, y_slice_train, model_params, model_type, logging
+            )
 
             # Save model of this fold in a dict
-            clf_dict['test'][fold_id] = clf
-
-            if post_params['calibration'] != 'false':
-                clf = calibrateModel(clf, X_cal, y_cal, logging, method=post_params['calibration'], final_model=False)
+            clf_dict["test"][fold_id] = clf
+
+            if post_params["calibration"] != "false":
+                clf = calibrateModel(
+                    clf,
+                    X_cal,
+                    y_cal,
+                    logging,
+                    method=post_params["calibration"],
+                    final_model=False,
+                )
 
             # discrete predictions
             y_test_pred_list.append(clf.predict(X_test[fold_id]))
 
-            if model_type == 'classification':
-            # probability predictions
+            if model_type == "classification":
+                # probability predictions
                 # Binary classification
                 if len(clf.classes_) == 2:
-                    y_test_prob_list.append(clf.predict_proba(X_test[fold_id])[:,1])
+                    y_test_prob_list.append(clf.predict_proba(X_test[fold_id])[:, 1])
                 elif len(clf.classes_) > 2:
                     y_test_prob_list.append(clf.predict_proba(X_test[fold_id]))
 
         # Merge list of prediction lists into one list
         y_test_pred = np.concatenate(y_test_pred_list, axis=0)
 
-        if model_type == 'classification':
+        if model_type == "classification":
             # Merge list of prediction probabilities lists into one list
             y_test_prob = np.concatenate(y_test_prob_list, axis=0)
 
     # If just regular train/test split has been applied
     else:
-        clf = globals()[model_name].trainModel(X_train, y_train, model_params, model_type, logging)
+        clf = globals()[model_name].trainModel(
+            X_train, y_train, model_params, model_type, logging
+        )
 
         # discrete prediction
         y_test_pred = clf.predict(X_test)
 
-        if model_type == 'classification':
+        if model_type == "classification":
             # probability prediction
-            y_test_prob = clf.predict_proba(X_test)[:,1]
+            y_test_prob = clf.predict_proba(X_test)[:, 1]
 
     # train model one last time on all samples (upsampled)
-    print('Train final model on all data')
-    logging.info('Train final model on all data')
+    logging.info("Train final model on all data")
 
     # Check if model needs to be calibrated
-    if post_params['calibration'] != 'false':
-        X_all, X_cal, y_all, y_cal = train_test_split(X_all, y_all, test_size=0.2, random_state=123)
+    if post_params["calibration"] != "false":
+        X_all, X_cal, y_all, y_cal = train_test_split(
+            X_all, y_all, test_size=0.2, random_state=123
+        )
 
     # Train final model
-    clf = globals()[model_name].trainModel(X_all, y_all, model_params, model_type, logging)
+    clf = globals()[model_name].trainModel(
+        X_all, y_all, model_params, model_type, logging
+    )
 
     # Save in dict
-    clf_dict['final'] = clf
+    clf_dict["final"] = clf
 
     # Save target column name as part of model
     clf.target = y_all.name
 
     # Save model in pickled format
-    filename = f'{given_name}/model/{model_name}_{model_type}.sav'
-    joblib.dump(clf, open(filename, 'wb'))
+    filename = f"{given_name}/model/{model_name}_{model_type}.sav"
+    joblib.dump(clf, open(filename, "wb"))
 
     # train set prediction of final model
     y_all_pred = clf.predict(X_all)
 
-    if model_type == 'classification':
-    # probability predictions
+    if model_type == "classification":
+        # probability predictions
         # Binary classification
         if len(clf.classes_) == 2:
-            y_all_prob = clf.predict_proba(X_all)[:,1]
+            y_all_prob = clf.predict_proba(X_all)[:, 1]
         elif len(clf.classes_) > 2:
             y_all_prob = clf.predict_proba(X_all)
 
-
-    if post_params['calibration'] != 'false':
-        cal_clf, cal_reg = calibrateModel(clf, X_cal, y_cal, logging, method=post_params['calibration'], final_model=True)
+    if post_params["calibration"] != "false":
+        cal_clf, cal_reg = calibrateModel(
+            clf,
+            X_cal,
+            y_cal,
+            logging,
+            method=post_params["calibration"],
+            final_model=True,
+        )
 
         # Save model in pickled format
-        filename = given_name + '/model/ebm_calibrated_{model_type}.sav'.format(model_type=model_type)
-        joblib.dump(cal_clf, open(filename, 'wb'))
+        filename = given_name + "/model/ebm_calibrated_{model_type}.sav".format(
+            model_type=model_type
+        )
+        joblib.dump(cal_clf, open(filename, "wb"))
 
         # train set prediction of final model
         y_all_pred = cal_clf.predict(X_all)
 
-        if model_type == 'classification':
+        if model_type == "classification":
             # probability predictions
             # Binary classification
             if len(clf.classes_) == 2:
@@ -162,26 +189,34 @@ def make_model(given_name, datasets, model_name, model_type, model_params, post_
     X_train_concat = np.concatenate(X_train, axis=0)
 
     post_datasets = {
-        'X_test_list': X_test,
-        'X_train_list': X_train,
-        'X_test_concat': X_test_concat,
-        'X_train_concat': X_train_concat,
-        'X_all': X_all,
-        'y_train_list': y_train,
-        'y_train_concat': y_train_concat,
-        'y_all': y_all,
-        'y_all_pred': y_all_pred,
-        'y_test_concat': y_test_concat,
-        'y_test_pred': y_test_pred,
-        'y_test_list': y_test,
+        "X_test_list": X_test,
+        "X_train_list": X_train,
+        "X_test_concat": X_test_concat,
+        "X_train_concat": X_train_concat,
+        "X_all": X_all,
+        "y_train_list": y_train,
+        "y_train_concat": y_train_concat,
+        "y_all": y_all,
+        "y_all_pred": y_all_pred,
+        "y_test_concat": y_test_concat,
+        "y_test_pred": y_test_pred,
+        "y_test_list": y_test,
     }
 
-    if model_type == 'classification':
-        post_datasets['y_all_prob'] = y_all_prob
-        post_datasets['y_test_prob'] = y_test_prob
-        post_datasets['y_test_prob_list'] = y_test_prob_list
+    if model_type == "classification":
+        post_datasets["y_all_prob"] = y_all_prob
+        post_datasets["y_test_prob"] = y_test_prob
+        post_datasets["y_test_prob_list"] = y_test_prob_list
 
     # Performance and other post modeling plots
-    postModellingPlots(clf_dict, model_name, model_type, given_name, post_datasets, post_params, logging)
+    postModellingPlots(
+        clf_dict,
+        model_name,
+        model_type,
+        given_name,
+        post_datasets,
+        post_params,
+        logging,
+    )
 
     return clf
diff --git a/scripts/utils/modelling/models/decision_rule.py b/scripts/utils/modelling/models/decision_rule.py
index b030bab..71a103b 100644
--- a/scripts/utils/modelling/models/decision_rule.py
+++ b/scripts/utils/modelling/models/decision_rule.py
@@ -1,7 +1,5 @@
 from interpret.glassbox import DecisionListClassifier
-import pickle
-from sklearn.model_selection import train_test_split
-from utils.modelling.performance import *
+
 
 def trainModel(X_train, y_train, params, model_type, logging):
     """
@@ -31,20 +29,21 @@ def trainModel(X_train, y_train, params, model_type, logging):
         If an unsupported model type is provided.
 
     """
-    if 'feature_names' not in params.keys():
-        params['feature_names'] = X_train.columns
-    if model_type == 'classification':
+    if "feature_names" not in params.keys():
+        params["feature_names"] = X_train.columns
+    if model_type == "classification":
         clf = DecisionListClassifier(**params)
     else:
-        print('Only classification available')
-        logging.warning('Only classification available')
+        print("Only classification available")
+        logging.warning("Only classification available")
 
     clf.fit(X_train, y_train)
-    print('Trained decision rule \n')
-    logging.info('Trained decision rule')
+    print("Trained decision rule \n")
+    logging.info("Trained decision rule")
 
     return clf
 
+
 def featureImportanceSave(clf, given_name, logging):
     """
     Save the feature importance graphs for the trained model.
@@ -99,8 +98,9 @@ def featureImportanceSave(clf, given_name, logging):
         with open(f"{given_name}/explain_{feature_name}.html", "w") as file:
             file.write(plotly_fig)
 
-    print(f'Decision lists for {index+1} features saved')
-    logging.info(f'Decision lists for {index+1} features saved')
+    print(f"Decision lists for {index+1} features saved")
+    logging.info(f"Decision lists for {index+1} features saved")
+
 
 def postModelPlots(clf, given_name, file_type, logging):
     featureImportanceSave(clf, given_name, logging)
diff --git a/scripts/utils/modelling/models/decision_tree.py b/scripts/utils/modelling/models/decision_tree.py
index 6a7ef31..940c7f8 100644
--- a/scripts/utils/modelling/models/decision_tree.py
+++ b/scripts/utils/modelling/models/decision_tree.py
@@ -1,6 +1,7 @@
 from sklearn import tree
-import pickle
-from utils.modelling.performance import *
+import pandas as pd
+import plotly.express as px
+
 
 def trainModel(X_train, y_train, params, model_type, logging):
     """
@@ -47,36 +48,25 @@ def trainModel(X_train, y_train, params, model_type, logging):
     >>> params = {'max_depth': 3, 'min_samples_split': 2}
     >>> clf = trainModel(X_train, y_train, params, 'classification', logging)
     """
-    if model_type == 'regression':
+    if model_type == "regression":
         clf = tree.DecisionTreeRegressor(**params)
-    elif model_type == 'classification':
+    elif model_type == "classification":
         clf = tree.DecisionTreeClassifier(**params)
     else:
-        print('Only regression or classification available')
-        logging.warning('Only regression or classification available')
+        logging.warning("Only regression or classification available")
 
     clf.fit(X_train, y_train)
-    logging.info(f'Model params:\n {clf.get_params}')
+    logging.info(f"Model params:\n {clf.get_params}")
 
-    print('Trained decision tree \n')
-    logging.info('Trained decision tree')
+    logging.info("Trained decision tree")
 
     return clf
 
-def plotTreeStructureSave(clf, given_name):
-
-    plt.figure(figsize=(30,30))
-
-    tree.plot_tree(clf, fontsize=10, feature_names=clf.feature_names_in_, class_names=clf.classes_)
-    plt.savefig(f'{given_name}/tree_plot.png')
-
-    print('Tree structure plot saved')
-
 
 def featureImportanceSave(clf, given_name, file_type, logging):
     """
     Generates and saves a bar plot of feature importance using Plotly.
-    
+
     Parameters:
     -----------
     clf: DecisionTreeClassifier or DecisionTreeRegressor object
@@ -87,37 +77,47 @@ def featureImportanceSave(clf, given_name, file_type, logging):
         The type of file in which the plot should be saved.
     logging: logging.Logger object
         A logging object to log information or errors.
-        
+
     Returns:
     --------
     None
-    
+
     Raises:
     -------
     None
-    
+
     Notes:
     ------
     - This function requires the Plotly package.
-    - The plot is saved in the given directory with the name 'gini_feature_importance.png' if 'file_type' is 'png', 
+    - The plot is saved in the given directory with the name 'gini_feature_importance.png' if 'file_type' is 'png',
       or 'gini_feature_importance.html' if 'file_type' is 'html'.
     """
-    importance_df = pd.DataFrame({'importance':clf.feature_importances_, 'feature':clf.feature_names_in_}).sort_values('importance', ascending=True).reset_index(drop=True)
-    importance_non_zero = importance_df[importance_df['importance'] > 0]
-    plotly_fig = px.bar(importance_non_zero, x='importance', y='feature')
+    importance_df = (
+        pd.DataFrame(
+            {"importance": clf.feature_importances_, "feature": clf.feature_names_in_}
+        )
+        .sort_values("importance", ascending=True)
+        .reset_index(drop=True)
+    )
+    importance_non_zero = importance_df[importance_df["importance"] > 0]
+    plotly_fig = px.bar(importance_non_zero, x="importance", y="feature")
 
     # Update size of figure
-    plotly_fig.update_layout(xaxis_title='Importance', yaxis_title='Feature',
-                      title=f'Feature importance',
-                      width=1000,
-                      height=800)
+    plotly_fig.update_layout(
+        xaxis_title="Importance",
+        yaxis_title="Feature",
+        title="Feature importance",
+        width=1000,
+        height=800,
+    )
+
+    if file_type == "png":
+        plotly_fig.write_image(f"{given_name}/gini_feature_importance.png")
+    elif file_type == "html":
+        plotly_fig.write_html(f"{given_name}/gini_feature_importance.html")
 
-    if file_type == 'png':
-        plotly_fig.write_image(f'{given_name}/gini_feature_importance.png')
-    elif file_type == 'html':
-        plotly_fig.write_html(f'{given_name}/gini_feature_importance.html')
+    logging.info("Gini feature importance plot saved")
 
-    print('Gini feature importance plot saved')
 
 def postModelPlots(clf, given_name, file_type, logging):
-    featureImportanceSave(clf, given_name, file_type, logging)
\ No newline at end of file
+    featureImportanceSave(clf, given_name, file_type, logging)
diff --git a/scripts/utils/modelling/models/ebm.py b/scripts/utils/modelling/models/ebm.py
index 3de1f59..68fe533 100644
--- a/scripts/utils/modelling/models/ebm.py
+++ b/scripts/utils/modelling/models/ebm.py
@@ -1,9 +1,8 @@
-from interpret.glassbox import ExplainableBoostingClassifier, ExplainableBoostingRegressor
-import pickle
-import random
-from sklearn.model_selection import train_test_split
-from utils.modelling.performance import *
-from utils.modelling.calibration import *
+from interpret.glassbox import (
+    ExplainableBoostingClassifier,
+    ExplainableBoostingRegressor,
+)
+
 
 def trainModel(X_train, y_train, params, model_type, logging):
     """
@@ -46,21 +45,18 @@ def trainModel(X_train, y_train, params, model_type, logging):
     The function logs the model parameters and a message indicating that the EBM model has been
     trained successfully.
     """
-    if 'feature_names' not in params.keys():
-        params['feature_names'] = X_train.columns
-    if model_type == 'regression':
+    if "feature_names" not in params.keys():
+        params["feature_names"] = X_train.columns
+    if model_type == "regression":
         clf = ExplainableBoostingRegressor(**params)
-    elif model_type == 'classification':
+    elif model_type == "classification":
         clf = ExplainableBoostingClassifier(**params)
     else:
-        print('Only regression or classification available')
-        logging.warning('Only regression or classification available')
+        logging.warning("Only regression or classification available")
 
     clf.fit(X_train, y_train)
-    logging.info(f'Model params:\n {clf.get_params}')
-
-    print('Trained explainable boosting machine \n')
-    logging.info('Trained explainable boosting machine')
+    logging.info(f"Model params:\n {clf.get_params}")
+    logging.info("Trained explainable boosting machine")
 
     return clf
 
@@ -101,16 +97,24 @@ def featureExplanationSave(clf, given_name, file_type, logging):
 
     The function logs a message indicating how many features have been saved.
     """
-    
+
     clf_global = clf.explain_global()
 
     # Save overall feature importance graph
     plotly_fig = clf_global.visualize()
 
-    if file_type == 'png':
-        plotly_fig.write_image('{given_name}/1_overall_feature_importance.png'.format(given_name=given_name))
-    elif file_type == 'html':
-        plotly_fig.write_html('{given_name}/1_overall_feature_importance.html'.format(given_name=given_name))
+    if file_type == "png":
+        plotly_fig.write_image(
+            "{given_name}/1_overall_feature_importance.png".format(
+                given_name=given_name
+            )
+        )
+    elif file_type == "html":
+        plotly_fig.write_html(
+            "{given_name}/1_overall_feature_importance.html".format(
+                given_name=given_name
+            )
+        )
 
     # Save feature specific explanation graphs
     for index, value in enumerate(clf.term_features_):
@@ -119,7 +123,9 @@ def featureExplanationSave(clf, given_name, file_type, logging):
         # Formatting feature name
         # if combined feature create combined feature name
         if len(value) == 2:
-            feature_name = f'{clf.feature_names[value[0]]}_x_{clf.feature_names[value[1]]}'
+            feature_name = (
+                f"{clf.feature_names[value[0]]}_x_{clf.feature_names[value[1]]}"
+            )
         else:
             feature_name = clf.feature_names[index]
 
@@ -128,14 +134,16 @@ def featureExplanationSave(clf, given_name, file_type, logging):
             if c in feature_name:
                 feature_name = feature_name.replace(c, "_")
 
-        if file_type == 'png':
-            plotly_fig.write_image(f'{given_name}/explain_{feature_name}.png')
-        elif file_type == 'html':
+        if file_type == "png":
+            plotly_fig.write_image(f"{given_name}/explain_{feature_name}.png")
+        elif file_type == "html":
             # or as html file
-            plotly_fig.write_html(f'{given_name}/explain_{feature_name}.html')
+            plotly_fig.write_html(f"{given_name}/explain_{feature_name}.html")
+
+    logging.info(
+        "Explanation plots of {n_features} features saved".format(n_features=index + 1)
+    )
 
-    print('Explanation plots of {n_features} features saved'.format(n_features=index+1))
-    logging.info('Explanation plots of {n_features} features saved'.format(n_features=index+1))
 
 def postModelPlots(clf, given_name, file_type, logging):
     featureExplanationSave(clf, given_name, file_type, logging)
diff --git a/scripts/utils/modelling/models/l_regression.py b/scripts/utils/modelling/models/l_regression.py
index c510b76..60b3602 100644
--- a/scripts/utils/modelling/models/l_regression.py
+++ b/scripts/utils/modelling/models/l_regression.py
@@ -1,61 +1,67 @@
-import pickle
 from interpret.glassbox import LinearRegression, LogisticRegression
-from utils.modelling.performance import *
+
 
 def trainModel(X_train, y_train, params, model_type, logging):
     # if 'feature_names' not in params.keys():
     #     params['feature_names'] = X_train.columns
-    if model_type == 'regression':
+    if model_type == "regression":
         clf = LinearRegression(**params)
-        clf_name = 'Linear regression'
-    elif model_type == 'classification':
+        clf_name = "Linear regression"
+    elif model_type == "classification":
         clf = LogisticRegression(**params)
         # Hard code classes_
         clf.classes_ = list(set(y_train))
-        clf_name = 'Logistic regression'
+        clf_name = "Logistic regression"
     else:
-        print('Only regression or classification available')
-        logging.warning('Only regression or classification available')
+        logging.warning("Only regression or classification available")
 
     clf.fit(X_train, y_train)
-    logging.info(f'Model non default params:\n {clf.kwargs}')
-
-    print(f'Trained {clf_name.lower()} \n')
-    logging.info(f'Trained {clf_name.lower()}')
+    logging.info(f"Model non default params:\n {clf.kwargs}")
+    logging.info(f"Trained {clf_name.lower()}")
 
     return clf
 
-def featureExplanationSave(clf, given_name, file_type, logging):
 
+def featureExplanationSave(clf, given_name, file_type, logging):
     clf_global = clf.explain_global()
 
     # Save overall feature importance graph
     plotly_fig = clf_global.visualize()
 
-    if file_type == 'png':
-        plotly_fig.write_image('{given_name}/1_overall_feature_importance.png'.format(given_name=given_name))
-    elif file_type == 'html':
-        plotly_fig.write_html('{given_name}/1_overall_feature_importance.html'.format(given_name=given_name))
+    if file_type == "png":
+        plotly_fig.write_image(
+            "{given_name}/1_overall_feature_importance.png".format(
+                given_name=given_name
+            )
+        )
+    elif file_type == "html":
+        plotly_fig.write_html(
+            "{given_name}/1_overall_feature_importance.html".format(
+                given_name=given_name
+            )
+        )
 
     # Save feature specific explanation graphs
-    for index, value in enumerate(clf.feature_groups_):
+    for index, value in enumerate(clf.feature_names_in_):
         plotly_fig = clf_global.visualize(index)
 
         # reformatting feature name
-        feature_name = clf.feature_names[index]
+        feature_name = clf.feature_names_in_[index]
         chars = "\\`./ "
         for c in chars:
             if c in feature_name:
                 feature_name = feature_name.replace(c, "_")
 
-        if file_type == 'png':
-            plotly_fig.write_image(f'{given_name}/explain_{feature_name}.png')
-        elif file_type == 'html':
+        if file_type == "png":
+            plotly_fig.write_image(f"{given_name}/explain_{feature_name}.png")
+        elif file_type == "html":
             # or as html file
-            plotly_fig.write_html(f'{given_name}/explain_{feature_name}.html')
+            plotly_fig.write_html(f"{given_name}/explain_{feature_name}.html")
+
+    logging.info(
+        "Explanation plots of {n_features} features saved".format(n_features=index + 1)
+    )
 
-    print('Explanation plots of {n_features} features saved'.format(n_features=index+1))
-    logging.info('Explanation plots of {n_features} features saved'.format(n_features=index+1))
 
 def postModelPlots(clf, given_name, file_type, logging):
-    featureExplanationSave(clf, given_name, file_type, logging)
\ No newline at end of file
+    featureExplanationSave(clf, given_name, file_type, logging)
diff --git a/scripts/utils/modelling/performance.py b/scripts/utils/modelling/performance.py
index d031709..7e69585 100644
--- a/scripts/utils/modelling/performance.py
+++ b/scripts/utils/modelling/performance.py
@@ -8,14 +8,24 @@
 from sklearn.calibration import calibration_curve
 from sklearn.metrics import brier_score_loss
 from sklearn.metrics import classification_report
-from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, mean_absolute_percentage_error, explained_variance_score, max_error, median_absolute_error, mean_squared_log_error, mean_poisson_deviance, mean_gamma_deviance
+from sklearn.metrics import (
+    mean_absolute_error,
+    mean_squared_error,
+    r2_score,
+    mean_absolute_percentage_error,
+    explained_variance_score,
+    max_error,
+    median_absolute_error,
+    mean_squared_log_error,
+)
 
 
 # The actual algorithms (grey as we refer to them dynamically)
-from utils.modelling.models import ebm
-from utils.modelling.models import decision_rule
-from utils.modelling.models import decision_tree
-from utils.modelling.models import l_regression
+from utils.modelling.models import ebm  # noqa: F401
+from utils.modelling.models import decision_rule  # noqa: F401
+from utils.modelling.models import decision_tree  # noqa: F401
+from utils.modelling.models import l_regression  # noqa: F401
+
 
 def plotConfusionMatrixStatic(given_name, y_true, y_pred, data_type, logging):
     """
@@ -44,82 +54,118 @@ def plotConfusionMatrixStatic(given_name, y_true, y_pred, data_type, logging):
 
     """
 
-    from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
+    from sklearn.metrics import ConfusionMatrixDisplay
+
     fig, ax = plt.subplots(figsize=(10, 8))
 
-    disp = ConfusionMatrixDisplay.from_predictions(y_true, y_pred, ax=ax)
+    disp = ConfusionMatrixDisplay.from_predictions(y_true, y_pred, ax=ax)  # noqa: F841
     plt.xticks(rotation=90)
-    plt.savefig('{given_name}/performance/{data_type}_confusion_matrix.png'.format(given_name=given_name, data_type=data_type), bbox_inches='tight')
+    plt.savefig(
+        "{given_name}/performance/{data_type}_confusion_matrix.png".format(
+            given_name=given_name, data_type=data_type
+        ),
+        bbox_inches="tight",
+    )
+
+    logging.info(f"Created and saved confusion matrix for {data_type} data")
 
-    print(f'Created and saved confusion matrix for {data_type} data')
-    logging.info(f'Created and saved confusion matrix for {data_type} data')
 
 # Mainly meant for binary classification
 def plotConfusionMatrixSlider(given_name, y_true, y_prob, data_type, logging):
     conf_matrices = []
-    steps=[]
+    steps = []
 
     threshold_list = np.arange(0.0, 1.05, 0.05)
 
     for threshold in threshold_list:
         y_pred = [1 if x > threshold else 0 for x in y_prob]
-        
-        df = pd.DataFrame({'y_true': y_true, 'y_pred': y_pred})
+
+        df = pd.DataFrame({"y_true": y_true, "y_pred": y_pred})
 
         # confusion matrix
         cm = []
-        for p in [0,1]:
+        for p in [0, 1]:
             new_row = []
-            for a in [1,0]:
-                new_row.append(len(df[(df['y_pred'] == p) & (df['y_true'] == a)])/len(y_pred))
+            for a in [1, 0]:
+                new_row.append(
+                    len(df[(df["y_pred"] == p) & (df["y_true"] == a)]) / len(y_pred)
+                )
             cm.append(new_row)
 
         # Add to list of matrices
         conf_matrices.append(cm)
 
-        # Create sklearn summary report 
-        report = classification_report(y_true, y_pred, output_dict=True, zero_division=0)
+        # Create sklearn summary report
+        report = classification_report(
+            y_true, y_pred, output_dict=True, zero_division=0
+        )
 
         # Create a list of lists for the matrix
         metrics_matrix = []
 
         # Iterate over the keys and values in the summary report dictionary
         for key, value in report.items():
-            if key == 'accuracy':
-                metrics_matrix.append(['', '', '', '', ''])
-                metrics_matrix.append(['Accuracy', '', '', value, ''])
-            elif key.startswith(('macro', 'weighted')):
-                metrics_matrix.append([key.capitalize(), value['precision'], value['recall'], value['f1-score'], value['support']])
+            if key == "accuracy":
+                metrics_matrix.append(["", "", "", "", ""])
+                metrics_matrix.append(["Accuracy", "", "", value, ""])
+            elif key.startswith(("macro", "weighted")):
+                metrics_matrix.append(
+                    [
+                        key.capitalize(),
+                        value["precision"],
+                        value["recall"],
+                        value["f1-score"],
+                        value["support"],
+                    ]
+                )
             else:
-                row = [key, value['precision'], value['recall'], value['f1-score'], value['support']]
+                row = [
+                    key,
+                    value["precision"],
+                    value["recall"],
+                    value["f1-score"],
+                    value["support"],
+                ]
                 metrics_matrix.append(row)
 
         # Formatting options
-        precision_format = '{:.3f}'
-        integer_format = '{:d}'
-        empty_string_format = ''
+        precision_format = "{:.3f}"
+        integer_format = "{:d}"
+        empty_string_format = ""
 
         # Format the matrix elements
         formatted_matrix = []
         for row in metrics_matrix:
-            formatted_row = [precision_format.format(cell) if isinstance(cell, float)
-                            else integer_format.format(cell) if isinstance(cell, int)
-                            else empty_string_format if cell == ''
-                            else cell
-                            for cell in row]
+            formatted_row = [
+                precision_format.format(cell)
+                if isinstance(cell, float)
+                else integer_format.format(cell)
+                if isinstance(cell, int)
+                else empty_string_format
+                if cell == ""
+                else cell
+                for cell in row
+            ]
             formatted_matrix.append(formatted_row)
 
         # transpose matrix
         metrics = list(zip(*formatted_matrix))
 
         # Add values to the different steps
-        steps.append(dict(method = "restyle",
-                    args = [{'z': [ cm ], #in the initial fig update z and text
-                        'text': [cm],
-                        'cells.values':[metrics]}],
-                        label=round(threshold,2),
-                        ))
-        
+        steps.append(
+            dict(
+                method="restyle",
+                args=[
+                    {
+                        "z": [cm],  # in the initial fig update z and text
+                        "text": [cm],
+                        "cells.values": [metrics],
+                    }
+                ],
+                label=round(threshold, 2),
+            )
+        )
+
         if threshold == 0.5:
             conf_matrix = cm
             table_metrics = metrics
@@ -130,69 +176,82 @@ def plotConfusionMatrixSlider(given_name, y_true, y_prob, data_type, logging):
     labels_r.reverse()
 
     # Make subplots top table bottom heatmap
-    fig = make_subplots(rows=1, cols=2,
-                        specs=[[{'type': 'table'},
-                            {'type': 'heatmap'}]])
-
-    # Create heatmap 
-    heatmap = go.Heatmap(x=labels, y=labels_r,
-                        z=conf_matrix,
-                        text=conf_matrix,
-                        texttemplate="%{text:.3f}",
-                        hovertemplate="<br>".join([
-                            "Predicted: %{y}",
-                            "Actual: %{x}",
-                            "Share of total cases: %{z}",
-                            "<extra></extra>"
-                        ])
+    fig = make_subplots(
+        rows=1, cols=2, specs=[[{"type": "table"}, {"type": "heatmap"}]]
+    )
+
+    # Create heatmap
+    heatmap = go.Heatmap(
+        x=labels,
+        y=labels_r,
+        z=conf_matrix,
+        text=conf_matrix,
+        texttemplate="%{text:.3f}",
+        hovertemplate="<br>".join(
+            [
+                "Predicted: %{y}",
+                "Actual: %{x}",
+                "Share of total cases: %{z}",
+                "<extra></extra>",
+            ]
+        ),
     )
 
     # Create table
-    metrics_table = go.Table(header=dict(values=['          ', 'Precision', 'Recall', 'F1-Score', 'Support']),
-                    cells=dict(values=table_metrics) 
-                    )
+    metrics_table = go.Table(
+        header=dict(
+            values=["          ", "Precision", "Recall", "F1-Score", "Support"]
+        ),
+        cells=dict(values=table_metrics),
+    )
 
-    # Add table and heatmap to figure 
+    # Add table and heatmap to figure
     fig.add_trace(metrics_table, row=1, col=1)
     fig.add_trace(heatmap, row=1, col=2)
 
+    fig.update_layout(
+        width=1000,
+        height=600,
+        xaxis_title="Actual",
+        yaxis_title="Predicted",
+        xaxis_type="category",
+        yaxis_type="category",
+        xaxis_side="top",
+        title_text="Normalized confusion matrix",
+        title_x=0.5,
+    )
 
-
-    fig.update_layout(width=1000, height=600,
-                    xaxis_title="Actual",
-                    yaxis_title="Predicted",
-                    xaxis_type="category", 
-                    yaxis_type="category", 
-                    xaxis_side="top",
-                    title_text= "Normalized confusion matrix", 
-                    title_x=0.5,
-                    )
-
-    sliders = [dict(
-        active=10,
-        currentvalue={"prefix": "Threshold: "},
-        pad={"t": 50}, #sort it out later
-        steps=steps
-    )]
+    sliders = [
+        dict(
+            active=10,
+            currentvalue={"prefix": "Threshold: "},
+            pad={"t": 50},  # sort it out later
+            steps=steps,
+        )
+    ]
 
     fig.update_layout(sliders=sliders)
 
-    fig.write_html(f'{given_name}/performance/{data_type}_confusion_matrix.html', auto_play=False)
+    fig.write_html(
+        f"{given_name}/performance/{data_type}_confusion_matrix.html", auto_play=False
+    )
 
-    print(f'Created and saved confusion matrix for {data_type} data')
-    logging.info(f'Created and saved confusion matrix for {data_type} data')
+    logging.info(f"Created and saved confusion matrix for {data_type} data")
 
 
-def plotConfusionMatrix(given_name, y_true, y_prob, y_pred, file_type, data_type, logging):
+def plotConfusionMatrix(
+    given_name, y_true, y_prob, y_pred, file_type, data_type, logging
+):
     # If html is wanted and binary classification
     # Make confusion matrix plot with slider
-    if (file_type=='html') & (len(set(y_true))==2):
+    if (file_type == "html") & (len(set(y_true)) == 2):
         plotConfusionMatrixSlider(given_name, y_true, y_prob, data_type, logging)
-    
+
     # Otherwise make 'simple' static confusion matrix plot
     else:
         plotConfusionMatrixStatic(given_name, y_true, y_pred, data_type, logging)
 
+
 def classificationReportSave(given_name, y_true, y_pred, data_type, logging):
     """
     Save the classification report as a CSV file.
@@ -221,10 +280,14 @@ def classificationReportSave(given_name, y_true, y_pred, data_type, logging):
 
     report = classification_report(y_true, y_pred, output_dict=True)
     report_df = pd.DataFrame(report).transpose()
-    report_df.to_csv('{given_name}/performance/{data_type}_classification_report.csv'.format(given_name=given_name, data_type=data_type))
+    report_df.to_csv(
+        "{given_name}/performance/{data_type}_classification_report.csv".format(
+            given_name=given_name, data_type=data_type
+        )
+    )
+
+    logging.info("Classification report saved")
 
-    print('Classification report saved')
-    logging.info('Classification report saved')
 
 def plotClassificationCurve(given_name, y_true, y_prob, curve_type, data_type, logging):
     """
@@ -251,52 +314,64 @@ def plotClassificationCurve(given_name, y_true, y_prob, curve_type, data_type, l
         Mean area under the curve (AUC) value for all folds or for the fitted model.
     """
     from sklearn.metrics import roc_curve, precision_recall_curve, auc
+
     curve_type = curve_type.lower()
 
-    if curve_type == 'roc':
-        title = 'ROC curve - {data_type} data'.format(data_type=data_type)
-        xlabel = 'False Positive Rate'
-        ylabel = 'True Positive Rate (Recall)'
+    if curve_type == "roc":
+        title = "ROC curve - {data_type} data".format(data_type=data_type)
+        xlabel = "False Positive Rate"
+        ylabel = "True Positive Rate (Recall)"
         diagCor1 = [0, 1]
         diagCor2 = [0, 1]
 
-        curve_ = 'roc'
+        curve_ = "roc"
 
-    elif ('recall' in curve_type and 'precision' in curve_type) or curve_type == 'pr':
-        title = 'Precision-Recall curve - {data_type}'.format(data_type=data_type)
-        xlabel = 'True Positive Rate (Recall)'
-        ylabel = 'Precision'
+    elif ("recall" in curve_type and "precision" in curve_type) or curve_type == "pr":
+        title = "Precision-Recall curve - {data_type}".format(data_type=data_type)
+        xlabel = "True Positive Rate (Recall)"
+        ylabel = "Precision"
 
         # add the random line (= share of positives in sample)
         if isinstance(y_true, list):
-            pos_share = sum([sum(el) for el in y_true]) / sum([len(el) for el in y_true])
+            pos_share = sum([sum(el) for el in y_true]) / sum(
+                [len(el) for el in y_true]
+            )
         else:
-            pos_share = sum(y_true)/len(y_true)
+            pos_share = sum(y_true) / len(y_true)
 
         diagCor1 = [0, 1]
         diagCor2 = [pos_share, pos_share]
 
-        curve_ = 'pr'
+        curve_ = "pr"
 
     # Create plot
     fig = go.Figure()
 
     # set axis range to 0 - 1
-    fig.update_layout(xaxis_range=[0, 1], yaxis_range=[0, 1],
-                      xaxis_title=xlabel, yaxis_title=ylabel,
-                      title=title,
-                      width=1000,
-                      height=800)
+    fig.update_layout(
+        xaxis_range=[0, 1],
+        yaxis_range=[0, 1],
+        xaxis_title=xlabel,
+        yaxis_title=ylabel,
+        title=title,
+        width=1000,
+        height=800,
+    )
 
     # Add diagonal reference line
-    fig.add_shape(type="line",
-                  xref="paper", yref="paper",
-                  x0=diagCor1[0], x1=diagCor1[1], y0=diagCor2[0], y1=diagCor2[1],
-                  line=dict(
-                      color="black",
-                      width=2,
-                      dash="dot",
-                  )
+    fig.add_shape(
+        type="line",
+        xref="paper",
+        yref="paper",
+        x0=diagCor1[0],
+        x1=diagCor1[1],
+        y0=diagCor2[0],
+        y1=diagCor2[1],
+        line=dict(
+            color="black",
+            width=2,
+            dash="dot",
+        ),
     )
 
     # Save the auc(s)
@@ -304,39 +379,40 @@ def plotClassificationCurve(given_name, y_true, y_prob, curve_type, data_type, l
 
     if isinstance(y_prob, list):
         for fold_id in range(len(y_prob)):
-
-            if curve_ == 'roc':
+            if curve_ == "roc":
                 xVar, yVar, thresholds = roc_curve(y_true[fold_id], y_prob[fold_id])
-            elif curve_ == 'pr':
-                yVar, xVar, thresholds = precision_recall_curve(y_true[fold_id], y_prob[fold_id])
+            elif curve_ == "pr":
+                yVar, xVar, thresholds = precision_recall_curve(
+                    y_true[fold_id], y_prob[fold_id]
+                )
 
             # Calculate area under curve (AUC)
             auc_list.append(auc(xVar, yVar))
-            fig.add_trace(go.Scatter(x=xVar, y=yVar, mode='lines', name=f'Fold {fold_id}'))
+            fig.add_trace(
+                go.Scatter(x=xVar, y=yVar, mode="lines", name=f"Fold {fold_id}")
+            )
     else:
-
-        if curve_ == 'roc':
+        if curve_ == "roc":
             xVar, yVar, thresholds = roc_curve(y_true, y_prob)
-        elif curve_ == 'pr':
+        elif curve_ == "pr":
             yVar, xVar, thresholds = precision_recall_curve(y_true, y_prob)
 
         # Calculate area under curve (AUC)
         auc_list.append(auc(xVar, yVar))
-        fig.add_trace(go.Scatter(x=xVar, y=yVar, mode='lines', name=f'Fitted model'))
+        fig.add_trace(go.Scatter(x=xVar, y=yVar, mode="lines", name="Fitted model"))
 
     # add (average) auc in image
-    fig.add_annotation(x=0.5, y=0,
-                       text=f"Mean AUC: {np.mean(auc_list)}",
-                       showarrow=False,
-                       yshift=10)
+    fig.add_annotation(
+        x=0.5, y=0, text=f"Mean AUC: {np.mean(auc_list)}", showarrow=False, yshift=10
+    )
 
-    fig.write_image(f'{given_name}/performance/{data_type}_{curve_type}_plot.png')
+    fig.write_image(f"{given_name}/performance/{data_type}_{curve_type}_plot.png")
 
-    print(f'Created and saved {curve_type} plot for {data_type} data')
-    logging.info(f'Created and saved {curve_type} plot for {data_type} data')
+    logging.info(f"Created and saved {curve_type} plot for {data_type} data")
 
     return np.mean(auc_list)
 
+
 def plotCalibrationCurve(given_name, y_true, y_prob, data_type, logging):
     """
     Plot the calibration curve for a set of true and predicted values.
@@ -384,21 +460,30 @@ def plotCalibrationCurve(given_name, y_true, y_prob, data_type, logging):
     fig = go.Figure()
 
     # set axis range to 0 - 1
-    fig.update_layout(xaxis_range=[0, 1], yaxis_range=[0, 1],
-                      xaxis_title='Predicted probability', yaxis_title='Share being positive',
-                      title=f'Calibration plot (reliability curve) - {data_type} data',
-                      width=1000,
-                      height=800)
+    fig.update_layout(
+        xaxis_range=[0, 1],
+        yaxis_range=[0, 1],
+        xaxis_title="Predicted probability",
+        yaxis_title="Share being positive",
+        title=f"Calibration plot (reliability curve) - {data_type} data",
+        width=1000,
+        height=800,
+    )
 
     # Add diagonal reference line
-    fig.add_shape(type="line",
-                  xref="paper", yref="paper",
-                  x0=0, x1=1, y0=0, y1=1,
-                  line=dict(
-                      color="black",
-                      width=2,
-                      dash="dot",
-                  )
+    fig.add_shape(
+        type="line",
+        xref="paper",
+        yref="paper",
+        x0=0,
+        x1=1,
+        y0=0,
+        y1=1,
+        line=dict(
+            color="black",
+            width=2,
+            dash="dot",
+        ),
     )
 
     # Save the brier score loss
@@ -407,34 +492,53 @@ def plotCalibrationCurve(given_name, y_true, y_prob, data_type, logging):
     if isinstance(y_prob, list):
         for fold_id in range(len(y_prob)):
             # summaries actuals and predicted probs to (bins) number of points
-            fraction_of_positives, mean_predicted_value = \
-                calibration_curve(y_true[fold_id], y_prob[fold_id], n_bins=10, strategy='quantile')
+            fraction_of_positives, mean_predicted_value = calibration_curve(
+                y_true[fold_id], y_prob[fold_id], n_bins=10, strategy="quantile"
+            )
 
             # Calculate area under curve (AUC)
             bsl_list.append(brier_score_loss(y_true[fold_id], y_prob[fold_id]))
-            fig.add_trace(go.Scatter(x=mean_predicted_value, y=fraction_of_positives, mode='markers+lines', name=f'Fold {fold_id}'))
+            fig.add_trace(
+                go.Scatter(
+                    x=mean_predicted_value,
+                    y=fraction_of_positives,
+                    mode="markers+lines",
+                    name=f"Fold {fold_id}",
+                )
+            )
     else:
         # summaries actuals and predicted probs to (bins) number of points
-        fraction_of_positives, mean_predicted_value = \
-            calibration_curve(y_true, y_prob, n_bins=10, strategy='quantile')
+        fraction_of_positives, mean_predicted_value = calibration_curve(
+            y_true, y_prob, n_bins=10, strategy="quantile"
+        )
 
         # Calculate area under curve (AUC)
         bsl_list.append(brier_score_loss(y_true, y_prob))
-        fig.add_trace(go.Scatter(x=mean_predicted_value, y=fraction_of_positives, mode='markers+lines', name=f'Fitted model'))
+        fig.add_trace(
+            go.Scatter(
+                x=mean_predicted_value,
+                y=fraction_of_positives,
+                mode="markers+lines",
+                name="Fitted model",
+            )
+        )
 
     # add (average) auc in image
-    fig.add_annotation(x=0.5, y=0,
-                       text=f"Mean Brier Score Loss: {np.mean(bsl_list)}",
-                       showarrow=False,
-                       yshift=10)
+    fig.add_annotation(
+        x=0.5,
+        y=0,
+        text=f"Mean Brier Score Loss: {np.mean(bsl_list)}",
+        showarrow=False,
+        yshift=10,
+    )
 
-    fig.write_image(f'{given_name}/performance/{data_type}_calibration_plot.png')
+    fig.write_image(f"{given_name}/performance/{data_type}_calibration_plot.png")
 
-    print(f'Created and saved calibration plot for {data_type} data')
-    logging.info(f'Created and saved calibration plot for {data_type} data')
+    logging.info(f"Created and saved calibration plot for {data_type} data")
 
     return
 
+
 # for multiclass classification WIP
 def multiClassPlotCalibrationCurvePlotly(given_name, actuals, probs, title, bins=10):
     """
@@ -447,7 +551,9 @@ def multiClassPlotCalibrationCurvePlotly(given_name, actuals, probs, title, bins
     :param saveFileName: str path to which to save the plot
     :return: calibration plot
     """
-    calibration_df = pd.DataFrame(columns=['classification','fraction_of_positives','mean_predicted_value'])
+    calibration_df = pd.DataFrame(
+        columns=["classification", "fraction_of_positives", "mean_predicted_value"]
+    )
 
     # loop through different classes
     for cl in probs.columns:
@@ -455,34 +561,57 @@ def multiClassPlotCalibrationCurvePlotly(given_name, actuals, probs, title, bins
         y_prob = probs[cl]
 
         # summarise actuals and predicted probs to (bins) number of points
-        fraction_of_positives, mean_predicted_value = \
-            calibration_curve(y_true, y_prob, n_bins=bins, strategy='quantile')
-
-        calibration_df = calibration_df.append(pd.DataFrame({'classification':cl, 'fraction_of_positives':fraction_of_positives, 'mean_predicted_value':mean_predicted_value}), ignore_index=True)
+        fraction_of_positives, mean_predicted_value = calibration_curve(
+            y_true, y_prob, n_bins=bins, strategy="quantile"
+        )
+
+        calibration_df = calibration_df.append(
+            pd.DataFrame(
+                {
+                    "classification": cl,
+                    "fraction_of_positives": fraction_of_positives,
+                    "mean_predicted_value": mean_predicted_value,
+                }
+            ),
+            ignore_index=True,
+        )
 
     # Create scatter plot
-    fig = px.scatter(calibration_df, x='mean_predicted_value', y='fraction_of_positives', title='Calibration plot (reliability curve)', color='classification',width=1200, height=800)
-
+    fig = px.scatter(
+        calibration_df,
+        x="mean_predicted_value",
+        y="fraction_of_positives",
+        title="Calibration plot (reliability curve)",
+        color="classification",
+        width=1200,
+        height=800,
+    )
 
     # Make trace be line plus dots
-    for l in range(len(fig.data)):
-        fig.data[l].update(mode='markers+lines')
+    for ld in range(len(fig.data)):
+        fig.data[ld].update(mode="markers+lines")
 
     # set axis range to 0 - 1
     # fig.update_layout(xaxis_range=[-0.1,1.1], yaxis_range=[-0.1,1.1], xaxis_title='Predicted probability', yaxis_title='Fraction of positives')
 
     # Add diagonal reference line
-    fig.add_shape(type="line",
-                  xref="paper", yref="paper",
-                  x0=0, x1=1, y0=0, y1=1,
-                  line=dict(
-                      color="black",
-                      width=2,
-                      dash="dot",
-                  )
+    fig.add_shape(
+        type="line",
+        xref="paper",
+        yref="paper",
+        x0=0,
+        x1=1,
+        y0=0,
+        y1=1,
+        line=dict(
+            color="black",
+            width=2,
+            dash="dot",
+        ),
     )
 
-    fig.show(renderer='browser')
+    fig.show(renderer="browser")
+
 
 def plotProbabilityDistribution(given_name, y_true, y_prob, data_type, logging):
     """
@@ -506,34 +635,39 @@ def plotProbabilityDistribution(given_name, y_true, y_prob, data_type, logging):
     None
     """
     import plotly.figure_factory as ff
-    df = pd.DataFrame({'actuals': y_true, 'prob': y_prob})
-    do = df[df['actuals']==1]['prob']
-    dont = df[df['actuals']==0]['prob']
+
+    df = pd.DataFrame({"actuals": y_true, "prob": y_prob})
+    do = df[df["actuals"] == 1]["prob"]
+    dont = df[df["actuals"] == 0]["prob"]
 
     # Catching any kind of exception
     try:
         # Create distplot with custom bin_size
-        fig = ff.create_distplot([do,dont], ['1','0'], colors=['green','red'], bin_size=.01)
+        fig = ff.create_distplot(
+            [do, dont], ["1", "0"], colors=["green", "red"], bin_size=0.01
+        )
     except Exception as e:
-        print(f'Could not create distribution plot because of \n{e}')
-        logging.info(f'Could not create distribution plot because of \n{e}')
+        logging.info(f"Could not create distribution plot because of \n{e}")
         return
 
     # Update size of figure
-    fig.update_layout(xaxis_title='Predicted probability', yaxis_title='Frequency',
-                      title=f'Distribution plot - {data_type} data',
-                      width=1000,
-                      height=800)
+    fig.update_layout(
+        xaxis_title="Predicted probability",
+        yaxis_title="Frequency",
+        title=f"Distribution plot - {data_type} data",
+        width=1000,
+        height=800,
+    )
 
     # fig.show(renderer='browser')
 
-    fig.write_image(f'{given_name}/performance/{data_type}_distribution_plot.png')
+    fig.write_image(f"{given_name}/performance/{data_type}_distribution_plot.png")
 
-    print(f'Created and saved probability distribution plot')
-    logging.info(f'Created and saved probability distribution plot')
+    logging.info("Created and saved probability distribution plot")
 
     return
 
+
 def plotDistribution(given_name, groups, values, data_type, logging):
     """
     Create a plotly histogram figure displaying the distribution of values for each group.
@@ -565,58 +699,58 @@ def plotDistribution(given_name, groups, values, data_type, logging):
     >>> values = [1, 2, 2, 3, 3, 3]
     >>> plotDistribution("myplot", groups, values, "training", logging.getLogger())
     """
-    df = pd.DataFrame({'groups': groups, 'values': values})
-    
+    df = pd.DataFrame({"groups": groups, "values": values})
+
     min_value = min(values)
     max_value = max(values)
     bin_size = (max_value - min_value) / 50
-    
-    colors = ['red','green','blue','purple','orange']
+
+    colors = ["red", "green", "blue", "purple", "orange"]
 
     # Catching any kind of exception
     try:
-        # Create distplot 
+        # Create distplot
         fig = go.Figure()
         for g in range(len(set(groups))):
-            X = df[df['groups']==g]['values']
-            fig.add_trace(go.Histogram(
-                x=X,
-                histnorm='probability density',
-                name=str(g), # name used in legend and hover labels
-                xbins=dict( # bins used for histogram
-                    start=min_value,
-                    end=max_value,
-                    size=bin_size
-                ),
-                marker_color=colors[g],
-                opacity=0.75
-            ))
+            X = df[df["groups"] == g]["values"]
+            fig.add_trace(
+                go.Histogram(
+                    x=X,
+                    histnorm="probability density",
+                    name=str(g),  # name used in legend and hover labels
+                    xbins=dict(  # bins used for histogram
+                        start=min_value, end=max_value, size=bin_size
+                    ),
+                    marker_color=colors[g],
+                    opacity=0.75,
+                )
+            )
     except Exception as e:
-        print(f'Could not create distribution plot because of \n{e}')
-        logging.info(f'Could not create distribution plot because of \n{e}')
+        logging.info(f"Could not create distribution plot because of \n{e}")
         return
 
     fig.update_layout(
-        xaxis_title='Predicted probability',
-        yaxis_title='Probability density',
-        title=f'Distribution plot - {data_type} data',
+        xaxis_title="Predicted probability",
+        yaxis_title="Probability density",
+        title=f"Distribution plot - {data_type} data",
         width=1000,
         height=800,
-        bargap=0.2, # gap between bars of adjacent location coordinates
-        bargroupgap=0.1 # gap between bars of the same location coordinates
+        bargap=0.2,  # gap between bars of adjacent location coordinates
+        bargroupgap=0.1,  # gap between bars of the same location coordinates
     )
 
-    fig.write_image(f'{given_name}/performance/{data_type}_distribution_plot.png')
+    fig.write_image(f"{given_name}/performance/{data_type}_distribution_plot.png")
 
-    print(f'Created and saved probability distribution plot')
-    logging.info(f'Created and saved probability distribution plot')
+    logging.info("Created and saved probability distribution plot")
 
     return
 
+
 """
 Metrics and plot which are related to regression
 """
 
+
 def plotYhatVsYSave(given_name, y_true, y_pred, data_type, logging):
     """
     Plots a scatter plot of predicted values (y_pred) against true values (y_true)
@@ -640,38 +774,47 @@ def plotYhatVsYSave(given_name, y_true, y_pred, data_type, logging):
     None
     """
 
-    plot_df = pd.DataFrame({'y_true':y_true, 'y_pred':y_pred})
-    fig = px.scatter(plot_df, 'y_true', 'y_pred')
-    fig.write_image('{given_name}/performance/{data_type}_scatter_yhat_vs_y.png'.format(given_name=given_name, data_type=data_type))
+    plot_df = pd.DataFrame({"y_true": y_true, "y_pred": y_pred})
+    fig = px.scatter(plot_df, "y_true", "y_pred")
+    fig.write_image(
+        "{given_name}/performance/{data_type}_scatter_yhat_vs_y.png".format(
+            given_name=given_name, data_type=data_type
+        )
+    )
 
-    print(f'Scatter plot of yhat vs y saved for {data_type}')
-    logging.info(f'Scatter plot of yhat vs y saved for {data_type}')
+    logging.info(f"Scatter plot of yhat vs y saved for {data_type}")
 
-def plotQuantileError(given_name, y_true, y_pred, data_type, logging):
 
+def plotQuantileError(given_name, y_true, y_pred, data_type, logging):
     # Add prediction error
-    plot_df = pd.DataFrame({'y_true':y_true, 'y_pred':y_pred, 'y_diff':y_pred - y_true})
+    plot_df = pd.DataFrame(
+        {"y_true": y_true, "y_pred": y_pred, "y_diff": y_pred - y_true}
+    )
 
     # Make 20 quantiles
-    plot_df['quantile'] = pd.qcut(plot_df['y_true'], 20, duplicates='drop')
+    plot_df["quantile"] = pd.qcut(plot_df["y_true"], 20, duplicates="drop")
 
     # Sort by quantile and make quantile colunn a string for plotting
-    plot_df = plot_df.iloc[plot_df['quantile'].cat.codes.argsort()]
-    plot_df['quantile'] = plot_df['quantile'].astype(str)
+    plot_df = plot_df.iloc[plot_df["quantile"].cat.codes.argsort()]
+    plot_df["quantile"] = plot_df["quantile"].astype(str)
 
-    fig = px.box(plot_df, 'quantile', 'y_diff')
+    fig = px.box(plot_df, "quantile", "y_diff")
     fig.update_layout(
-        xaxis_title='Actual',
-        yaxis_title='Prediction - actual',
-        title=f'Quantile error plot - {data_type} data',
+        xaxis_title="Actual",
+        yaxis_title="Prediction - actual",
+        title=f"Quantile error plot - {data_type} data",
         width=1000,
-        height=800
+        height=800,
+    )
+
+    fig.write_image(
+        "{given_name}/performance/{data_type}_quantile_error_plot.png".format(
+            given_name=given_name, data_type=data_type
+        )
     )
 
-    fig.write_image('{given_name}/performance/{data_type}_quantile_error_plot.png'.format(given_name=given_name, data_type=data_type))
+    logging.info(f"Quantile error plot saved for {data_type}")
 
-    print(f'Quantile error plot saved for {data_type}')
-    logging.info(f'Quantile error plot saved for {data_type}')
 
 def regressionMetricsTable(given_name, y_true, y_pred, X_all, data_type, logging):
     y_true_pos = np.clip(y_true, 0, None)
@@ -680,7 +823,7 @@ def regressionMetricsTable(given_name, y_true, y_pred, X_all, data_type, logging
     # Calculate metrics
     mae = mean_absolute_error(y_true, y_pred)
     mse = mean_squared_error(y_true, y_pred)
-    rmse = mse ** 0.5
+    rmse = mse**0.5
     r2 = r2_score(y_true, y_pred)
     adj_r2 = 1 - (1 - r2) * (len(y_true) - 1) / (len(y_true) - X_all.shape[1] - 1)
     mape = mean_absolute_percentage_error(y_true, y_pred)
@@ -688,7 +831,7 @@ def regressionMetricsTable(given_name, y_true, y_pred, X_all, data_type, logging
     me = max_error(y_true, y_pred)
     medae = median_absolute_error(y_true, y_pred)
     msle = mean_squared_log_error(y_true_pos, y_pred_pos)
-    rmsle_value = msle ** 0.5
+    rmsle_value = msle**0.5
 
     header = ["Metric"]
 
@@ -704,11 +847,13 @@ def regressionMetricsTable(given_name, y_true, y_pred, X_all, data_type, logging
         ["Max Error"],
         ["Median Absolute Error (MedAE)"],
         ["Mean Squared Log Error (MSLE)"],
-        ["Root Mean Squared Log Error (RMSLE)"]
+        ["Root Mean Squared Log Error (RMSLE)"],
     ]
 
     # Create the table
-    fig = go.Figure(data=[go.Table(header=dict(values=header), cells=dict(values=rows))])
+    fig = go.Figure(
+        data=[go.Table(header=dict(values=header), cells=dict(values=rows))]
+    )
 
     # Add metrics data
     metric_values = [
@@ -722,7 +867,7 @@ def regressionMetricsTable(given_name, y_true, y_pred, X_all, data_type, logging
         [me],
         [medae],
         [msle],
-        [rmsle_value]
+        [rmsle_value],
     ]
 
     metric_names = [row for row in rows]
@@ -731,10 +876,12 @@ def regressionMetricsTable(given_name, y_true, y_pred, X_all, data_type, logging
     cells_values = [metric_names, metric_values]
     column_names = ["Metric", "Value"]
 
-    fig.add_trace(go.Table(
-        header=dict(values=column_names),
-        cells=dict(values=cells_values, format=["",".3"])
-    ))
+    fig.add_trace(
+        go.Table(
+            header=dict(values=column_names),
+            cells=dict(values=cells_values, format=["", ".3"]),
+        )
+    )
 
     # Update table layout
     fig.update_layout(
@@ -743,16 +890,17 @@ def regressionMetricsTable(given_name, y_true, y_pred, X_all, data_type, logging
     )
 
     # Save table
-    fig.write_image(f'{given_name}/performance/{data_type}_regression_metrics.png')
+    fig.write_image(f"{given_name}/performance/{data_type}_regression_metrics.png")
 
-    print(f'Created and saved regression metrics table')
-    logging.info(f'Created and saved regression metrics table')
+    logging.info("Created and saved regression metrics table")
 
     return
-    
+
 
 # To be used for feature exploration (TODO add more colors)
-def plotDistributionViolin(given_name, groups, values, data_type, logging):
+def plotDistributionViolin(
+    given_name, feature_name, groups, values, data_type, logging
+):
     """
     Plot violin plot of distribution of values across different groups.
 
@@ -786,61 +934,62 @@ def plotDistributionViolin(given_name, groups, values, data_type, logging):
     --------
     >>> plotDistributionViolin('my_figure', [0, 1, 0, 1], [2.5, 3.7, 4.2, 5.3], 'continuous', logging)
     """
-    df = pd.DataFrame({'groups': groups, 'values': values})
-    
-    colors = ['red','green','blue','purple','orange']
+    df = pd.DataFrame({"groups": groups, "values": values})
+
+    colors = ["red", "green", "blue", "purple", "orange"]
 
     # Catching any kind of exception
     try:
-        # Create Violin plot 
+        # Create Violin plot
         fig = go.Figure()
         for g in range(len(set(groups))):
-            X = df[df['groups']==g]['values']
-            fig.add_trace(go.Violin(
-                x=X,
-                name=str(g), # name used in legend and hover labels
-                marker_color=colors[g],
-                opacity=0.75
-            ))
+            X = df[df["groups"] == g]["values"]
+            fig.add_trace(
+                go.Violin(
+                    x=X,
+                    name=str(g),  # name used in legend and hover labels
+                    marker_color=colors[g],
+                    opacity=0.75,
+                )
+            )
     except Exception as e:
-        print(f'Could not create distribution plot because of \n{e}')
-        logging.info(f'Could not create distribution plot because of \n{e}')
+        logging.info(f"Could not create distribution plot because of \n{e}")
         return
 
     fig.update_layout(
-        xaxis_title='Value',
-        yaxis_title='Group',
-        title=f'Distribution plot - {data_type} data',
+        xaxis_title="Value",
+        yaxis_title="Group",
+        title=f"Distribution plot - {data_type} data",
         width=1000,
-        height=800
+        height=800,
     )
 
-    fig.write_image(f'{given_name}/feature_info/{feature_name}_class_distributions.png')
+    fig.write_image(f"{given_name}/feature_info/{feature_name}_distributions.png")
 
-    print(f'Created and saved feature distribution plot')
-    logging.info(f'Created and saved feature distribution plot')
+    logging.info("Created and saved feature distribution plot")
 
     return
 
+
 # TODO below function would need to have the test models available and make the calucations using those
-# So that the X_test is actually not seen yet by the model 
+# So that the X_test is actually not seen yet by the model
 # Currently the clf['final'] is the model trained over all data
 def scorePartialCorrelation(given_name, clf, post_datasets):
-    for fold_id in range(len(post_datasets['X_test_list'])):
-        clf_fold = clf['test'][fold_id]
+    for fold_id in range(len(post_datasets["X_test_list"])):
+        clf_fold = clf["test"][fold_id]
 
-        X_test = post_datasets['X_test_list'][fold_id]
-        X_train = post_datasets['X_train_list'][fold_id]
-        y_test = post_datasets['y_test_list'][fold_id]
-        y_train = post_datasets['y_train_list'][fold_id]
+        X_test = post_datasets["X_test_list"][fold_id]
+        X_train = post_datasets["X_train_list"][fold_id]
+        y_test = post_datasets["y_test_list"][fold_id]
+        y_train = post_datasets["y_train_list"][fold_id]
 
-        sl_test = clf_fold.predict_and_contrib(X_test, output='labels')
+        sl_test = clf_fold.predict_and_contrib(X_test, output="labels")
         X_test_scores = pd.DataFrame(sl_test[1], columns=clf_fold.feature_names)
-        y_test_label = pd.Series(y_test, name='target')
+        y_test_label = pd.Series(y_test, name="target")
 
-        sl_train = clf_fold.predict_and_contrib(X_train, output='labels')
+        sl_train = clf_fold.predict_and_contrib(X_train, output="labels")
         X_train_scores = pd.DataFrame(sl_train[1], columns=clf_fold.feature_names)
-        y_train_label = pd.Series(y_train, name='target')
+        y_train_label = pd.Series(y_train, name="target")
 
     # Define function for partial correlation
     def partial_correlation(X, y):
@@ -850,56 +999,103 @@ def partial_correlation(X, y):
                 data=pd.concat([X, y], axis=1).astype(float),
                 x=feature_name,
                 y=y.name,
-                x_covar=[f for f in X.columns if f != feature_name]
-            ).loc['pearson', 'r']
+                x_covar=[f for f in X.columns if f != feature_name],
+            ).loc["pearson", "r"]
         return out
 
     parscore_test = partial_correlation(X_test_scores, y_test_label)
     parscore_train = partial_correlation(X_train_scores, y_train_label)
-    parscore_diff = pd.Series(parscore_test - parscore_train, name = 'parscore_diff')
+    # parscore_diff = pd.Series(parscore_test - parscore_train, name = 'parscore_diff')
 
     # Plot parshap
-    plotmin, plotmax = min(parscore_train.min(), parscore_test.min()), max(parscore_train.max(), parscore_test.max())
-    plotbuffer = .05 * (plotmax - plotmin)
+    plotmin, plotmax = (
+        min(parscore_train.min(), parscore_test.min()),
+        max(parscore_train.max(), parscore_test.max()),
+    )
+    plotbuffer = 0.05 * (plotmax - plotmin)
     fig, ax = plt.subplots()
     if plotmin < 0:
-        ax.vlines(0, plotmin - plotbuffer, plotmax + plotbuffer, color='darkgrey', zorder=0)
-        ax.hlines(0, plotmin - plotbuffer, plotmax + plotbuffer, color='darkgrey', zorder=0)
+        ax.vlines(
+            0, plotmin - plotbuffer, plotmax + plotbuffer, color="darkgrey", zorder=0
+        )
+        ax.hlines(
+            0, plotmin - plotbuffer, plotmax + plotbuffer, color="darkgrey", zorder=0
+        )
     ax.plot(
-        [plotmin - plotbuffer, plotmax + plotbuffer], [plotmin - plotbuffer, plotmax + plotbuffer],
-        color='darkgrey', zorder=0
+        [plotmin - plotbuffer, plotmax + plotbuffer],
+        [plotmin - plotbuffer, plotmax + plotbuffer],
+        color="darkgrey",
+        zorder=0,
     )
     sc = ax.scatter(
-        parscore_train, parscore_test,
-        edgecolor='grey',
-        #   c=[5]*16, 
-          s=50, 
-          cmap=plt.cm.get_cmap('Reds'))
-    ax.set(title='Partial correlation bw Score and target...', xlabel='... on Train data', ylabel='... on Test data')
+        parscore_train,
+        parscore_test,
+        edgecolor="grey",
+        #   c=[5]*16,
+        s=50,
+        cmap=plt.cm.get_cmap("Reds"),
+    )
+    ax.set(
+        title="Partial correlation bw Score and target...",
+        xlabel="... on Train data",
+        ylabel="... on Test data",
+    )
     cbar = fig.colorbar(sc)
     cbar.set_ticks([])
     for txt in parscore_train.index:
-        ax.annotate(txt, (parscore_train[txt], parscore_test[txt] + plotbuffer / 2), ha='center', va='bottom')
-    fig.savefig(f'{given_name}/performance/PartialCorrelation.png', dpi=300, bbox_inches="tight")
+        ax.annotate(
+            txt,
+            (parscore_train[txt], parscore_test[txt] + plotbuffer / 2),
+            ha="center",
+            va="bottom",
+        )
+    fig.savefig(
+        f"{given_name}/performance/PartialCorrelation.png", dpi=300, bbox_inches="tight"
+    )
 
 
-def postModellingPlots(clf, model_name, model_type, given_name, post_datasets, post_params, logging):
+def postModellingPlots(
+    clf, model_name, model_type, given_name, post_datasets, post_params, logging
+):
     # Performance and other post modeling plots
     # unpack dict
-    X_all = post_datasets['X_all']
-    y_all, y_all_pred = post_datasets['y_all'], post_datasets['y_all_pred']
-    y_test_concat, y_test_pred = post_datasets['y_test_concat'], post_datasets['y_test_pred']
-    y_test_list = post_datasets['y_test_list']
+    X_all = post_datasets["X_all"]
+    y_all, y_all_pred = post_datasets["y_all"], post_datasets["y_all_pred"]
+    y_test_concat, y_test_pred = (
+        post_datasets["y_test_concat"],
+        post_datasets["y_test_pred"],
+    )
+    y_test_list = post_datasets["y_test_list"]
 
-    if model_type == 'classification':
+    if model_type == "classification":
         # probabilities only for classifications
-        y_test_prob, y_all_prob, y_test_prob_list = post_datasets['y_test_prob'], post_datasets['y_all_prob'], post_datasets['y_test_prob_list']
+        y_test_prob, y_all_prob, y_test_prob_list = (
+            post_datasets["y_test_prob"],
+            post_datasets["y_all_prob"],
+            post_datasets["y_test_prob_list"],
+        )
 
         # Threshold dependant
-        plotConfusionMatrix(given_name, y_all, y_all_prob, y_all_pred, post_params['file_type'], data_type='final_train', logging=logging)
-        plotConfusionMatrix(given_name, y_test_concat, y_test_prob, y_test_pred, post_params['file_type'], data_type='test', logging=logging)
-
-        if len(clf['final'].classes_) == 2:
+        plotConfusionMatrix(
+            given_name,
+            y_all,
+            y_all_prob,
+            y_all_pred,
+            post_params["file_type"],
+            data_type="final_train",
+            logging=logging,
+        )
+        plotConfusionMatrix(
+            given_name,
+            y_test_concat,
+            y_test_prob,
+            y_test_pred,
+            post_params["file_type"],
+            data_type="test",
+            logging=logging,
+        )
+
+        if len(clf["final"].classes_) == 2:
             # Also create pr curve for class 0
             y_all_neg = np.array([1 - j for j in list(y_all)])
             y_all_prob_neg = np.array([1 - j for j in list(y_all_prob)])
@@ -908,74 +1104,187 @@ def postModellingPlots(clf, model_name, model_type, given_name, post_datasets, p
             y_test_prob_list_neg = [[1 - j for j in i] for i in y_test_prob_list]
 
             # Threshold independant
-            plotClassificationCurve(given_name, y_all, y_all_prob, curve_type='roc', data_type='final_train', logging=logging)
-            plotClassificationCurve(given_name, y_test_list, y_test_prob_list, curve_type='roc', data_type='test', logging=logging)
-
-            plotClassificationCurve(given_name, y_all, y_all_prob, curve_type='pr', data_type='final_train_class1', logging=logging)
-            plotClassificationCurve(given_name, y_all_neg, y_all_prob_neg, curve_type='pr', data_type='final_train_class0', logging=logging)
-
-            plotClassificationCurve(given_name, y_test_list, y_test_prob_list, curve_type='pr', data_type='test_data_class1', logging=logging)
-            plotClassificationCurve(given_name, y_test_list_neg, y_test_prob_list_neg, curve_type='pr', data_type='test_data_class0', logging=logging)
-
-            plotCalibrationCurve(given_name, y_all, y_all_prob, data_type='final_train', logging=logging)
-            plotCalibrationCurve(given_name, y_test_list, y_test_prob_list, data_type='test', logging=logging)
-
-            plotProbabilityDistribution(given_name, y_all, y_all_prob, data_type='final_train', logging=logging)
-            plotProbabilityDistribution(given_name, y_test_concat, y_test_prob, data_type='test', logging=logging)
+            plotClassificationCurve(
+                given_name,
+                y_all,
+                y_all_prob,
+                curve_type="roc",
+                data_type="final_train",
+                logging=logging,
+            )
+            plotClassificationCurve(
+                given_name,
+                y_test_list,
+                y_test_prob_list,
+                curve_type="roc",
+                data_type="test",
+                logging=logging,
+            )
+
+            plotClassificationCurve(
+                given_name,
+                y_all,
+                y_all_prob,
+                curve_type="pr",
+                data_type="final_train_class1",
+                logging=logging,
+            )
+            plotClassificationCurve(
+                given_name,
+                y_all_neg,
+                y_all_prob_neg,
+                curve_type="pr",
+                data_type="final_train_class0",
+                logging=logging,
+            )
+
+            plotClassificationCurve(
+                given_name,
+                y_test_list,
+                y_test_prob_list,
+                curve_type="pr",
+                data_type="test_data_class1",
+                logging=logging,
+            )
+            plotClassificationCurve(
+                given_name,
+                y_test_list_neg,
+                y_test_prob_list_neg,
+                curve_type="pr",
+                data_type="test_data_class0",
+                logging=logging,
+            )
+
+            plotCalibrationCurve(
+                given_name, y_all, y_all_prob, data_type="final_train", logging=logging
+            )
+            plotCalibrationCurve(
+                given_name,
+                y_test_list,
+                y_test_prob_list,
+                data_type="test",
+                logging=logging,
+            )
+
+            plotProbabilityDistribution(
+                given_name, y_all, y_all_prob, data_type="final_train", logging=logging
+            )
+            plotProbabilityDistribution(
+                given_name,
+                y_test_concat,
+                y_test_prob,
+                data_type="test",
+                logging=logging,
+            )
 
             # TODO fix this
             # scorePartialCorrelation(given_name, clf, post_datasets)
 
         # If multiclass classification
-        elif len(clf['final'].classes_) > 2:
+        elif len(clf["final"].classes_) > 2:
             # loop through classes
-            for c in clf['final'].classes_:
-
+            for c in clf["final"].classes_:
                 # stating the class
-                print(f'\nFor class {c}:')
-                logging.info(f'\nFor class {c}:')
+                logging.info(f"\nFor class {c}:")
 
                 # creating a list of all the classes except the current class
-                other_class = [x for x in clf['final'].classes_ if x != c]
+                other_class = [x for x in clf["final"].classes_ if x != c]
 
                 # Get index of selected class in clf['final'].classes_
-                class_index = list(clf['final'].classes_).index(c)
+                class_index = list(clf["final"].classes_).index(c)
 
                 # marking the current class as 1 and all other classes as 0
-                y_test_list_ova = [[0 if x in other_class else 1 for x in fold_] for fold_ in y_test_list]
-                y_test_prob_list_ova = [[x[class_index] for x in fold_] for fold_ in y_test_prob_list]
+                y_test_list_ova = [
+                    [0 if x in other_class else 1 for x in fold_]
+                    for fold_ in y_test_list
+                ]
+                y_test_prob_list_ova = [
+                    [x[class_index] for x in fold_] for fold_ in y_test_prob_list
+                ]
 
                 # concatonate probs together to one list for distribution plot
                 y_test_ova = np.concatenate(y_test_list_ova, axis=0)
                 y_test_prob_ova = np.concatenate(y_test_prob_list_ova, axis=0)
 
-                y_all_ova = [0 if x in other_class else 1 for x in y_all]
-                y_all_prob_ova = [x[class_index] for x in y_all_prob]
-
+                # y_all_ova = [0 if x in other_class else 1 for x in y_all]
+                # y_all_prob_ova = [x[class_index] for x in y_all_prob]
 
                 # Threshold independant
                 # plotClassificationCurve(given_name, y_all_ova, y_all_prob_ova, curve_type='roc', data_type=f'final_train_class_{c}', logging=logging)
-                plotClassificationCurve(given_name, y_test_list_ova, y_test_prob_list_ova, curve_type='roc', data_type=f'test_class_{c}', logging=logging)
+                plotClassificationCurve(
+                    given_name,
+                    y_test_list_ova,
+                    y_test_prob_list_ova,
+                    curve_type="roc",
+                    data_type=f"test_class_{c}",
+                    logging=logging,
+                )
 
                 # plotClassificationCurve(given_name, y_all_ova, y_all_prob_ova, curve_type='pr', data_type='final_train_class1', logging=logging)
-                plotClassificationCurve(given_name, y_test_list_ova, y_test_prob_list_ova, curve_type='pr', data_type=f'test_class_{c}', logging=logging)
+                plotClassificationCurve(
+                    given_name,
+                    y_test_list_ova,
+                    y_test_prob_list_ova,
+                    curve_type="pr",
+                    data_type=f"test_class_{c}",
+                    logging=logging,
+                )
 
                 # multiClassPlotCalibrationCurvePlotly(given_name, y_all, pd.DataFrame(y_all_prob, columns=clf['final'].classes_), title='fun')
-                plotCalibrationCurve(given_name, y_test_list_ova, y_test_prob_list_ova, data_type=f'test_class_{c}', logging=logging)
+                plotCalibrationCurve(
+                    given_name,
+                    y_test_list_ova,
+                    y_test_prob_list_ova,
+                    data_type=f"test_class_{c}",
+                    logging=logging,
+                )
 
                 # plotProbabilityDistribution(given_name, y_all_ova, y_all_prob_ova, data_type='final_train', logging=logging)
-                plotProbabilityDistribution(given_name, y_test_ova, y_test_prob_ova, data_type=f'test_class_{c}', logging=logging)
+                plotProbabilityDistribution(
+                    given_name,
+                    y_test_ova,
+                    y_test_prob_ova,
+                    data_type=f"test_class_{c}",
+                    logging=logging,
+                )
 
     # if regression
-    elif model_type == 'regression':
-        plotYhatVsYSave(given_name, y_test_concat, y_test_pred, data_type='test', logging=logging)
-        plotYhatVsYSave(given_name, y_all, y_all_pred, data_type='final_train', logging=logging)
-
-        plotQuantileError(given_name, y_test_concat, y_test_pred, data_type='test', logging=logging)
-        plotQuantileError(given_name, y_all, y_all_pred, data_type='final_train', logging=logging)
-
-        regressionMetricsTable(given_name, y_test_concat, y_test_pred, X_all, data_type='test', logging=logging)
-        regressionMetricsTable(given_name, y_all, y_all_pred, X_all, data_type='final_train', logging=logging)
+    elif model_type == "regression":
+        plotYhatVsYSave(
+            given_name, y_test_concat, y_test_pred, data_type="test", logging=logging
+        )
+        plotYhatVsYSave(
+            given_name, y_all, y_all_pred, data_type="final_train", logging=logging
+        )
+
+        plotQuantileError(
+            given_name, y_test_concat, y_test_pred, data_type="test", logging=logging
+        )
+        plotQuantileError(
+            given_name, y_all, y_all_pred, data_type="final_train", logging=logging
+        )
+
+        regressionMetricsTable(
+            given_name,
+            y_test_concat,
+            y_test_pred,
+            X_all,
+            data_type="test",
+            logging=logging,
+        )
+        regressionMetricsTable(
+            given_name,
+            y_all,
+            y_all_pred,
+            X_all,
+            data_type="final_train",
+            logging=logging,
+        )
 
     # Post modeling plots, specific per model but includes feature importance among others
-    globals()[model_name].postModelPlots(clf['final'], given_name + '/feature_importance', post_params['file_type'], logging)
\ No newline at end of file
+    globals()[model_name].postModelPlots(
+        clf["final"],
+        given_name + "/feature_importance",
+        post_params["file_type"],
+        logging,
+    )
diff --git a/scripts/utils/output_scripts/decision_rule_as_code.py b/scripts/utils/output_scripts/decision_rule_as_code.py
index cb5bdb2..d3e442c 100644
--- a/scripts/utils/output_scripts/decision_rule_as_code.py
+++ b/scripts/utils/output_scripts/decision_rule_as_code.py
@@ -1,9 +1,4 @@
-import numpy as np
-import pandas as pd
-from interpret.glassbox import ExplainableBoostingClassifier
-from contextlib import redirect_stdout
-
 def save_model_and_extras(clf, model_name, split, logging):
     # Decision rule not yet translated to SQL
-    print('SQL version of Decision Rule not yet available')
-    logging.info('SQL version of Decision Rule not yet available')
+    print("SQL version of Decision Rule not yet available")
+    logging.info("SQL version of Decision Rule not yet available")
diff --git a/scripts/utils/output_scripts/decision_tree_as_code.py b/scripts/utils/output_scripts/decision_tree_as_code.py
index 4bc5661..e2199d9 100644
--- a/scripts/utils/output_scripts/decision_tree_as_code.py
+++ b/scripts/utils/output_scripts/decision_tree_as_code.py
@@ -3,20 +3,19 @@
 
 # outputing the tree as code
 from sklearn.tree import _tree
-import pandas as pd
 import numpy as np
 from contextlib import redirect_stdout
 
 
 def tree_to_sql(tree):
-    '''
-	Outputs a decision tree model as an SQL Case When statement
+    """
+    Outputs a decision tree model as an SQL Case When statement
 
-	Parameters:
-	-----------
-	tree: sklearn decision tree model
-		The decision tree to represent as an SQL function
-	'''
+    Parameters:
+    -----------
+    tree: sklearn decision tree model
+            The decision tree to represent as an SQL function
+    """
 
     tree_ = tree.tree_
     feature_name = [
@@ -34,9 +33,9 @@ def recurse(node, depth):
             threshold = tree_.threshold[node]
 
             if threshold % 1 == 0.5:
-                cast = '::INT'
+                cast = "::INT"
             else:
-                cast = ''
+                cast = ""
 
             print("{}CASE WHEN {}{} <= {} THEN".format(indent, name, cast, threshold))
             recurse(tree_.children_left[node], depth + 1)
@@ -44,70 +43,43 @@ def recurse(node, depth):
             recurse(tree_.children_right[node], depth + 1)
             print("{}END".format(indent))
         else:
-            class_values = tree_.value[node]
-            samples = tree_.n_node_samples[node]
-            max_value = int(np.max(class_values))
-            predicted_class = tree.classes_[np.argmax(class_values)]
-            print("{} {} -- train data precision: {:.2f} ({}/{})".format(indent, max_value / samples, max_value / samples, max_value,
-                                                                samples))
-
-    recurse(0, 1)
-
-    print('AS pred_classification')
-
-
-def getDecisionPath(clf, sample):
-    # WIP to path to see why decision was made
-    # https://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html
-    n_nodes = clf.tree_.node_count
-    children_left = clf.tree_.children_left
-    children_right = clf.tree_.children_right
-    feature_index = clf.tree_.feature
-    feature_names = clf.feature_names_in_
-    threshold = clf.tree_.threshold
-
-    node_indicator = clf.decision_path(sample)
-    leaf_id = clf.apply(sample)
-
-    sample_id = 1
-
-    # obtain ids of the nodes `sample_id` goes through, i.e., row `sample_id`
-    node_index = node_indicator.indices[
-                 node_indicator.indptr[sample_id]: node_indicator.indptr[sample_id + 1]
-                 ]
+            if hasattr(tree, "classes_"):
+                class_values = tree_.value[node]
+                samples = tree_.n_node_samples[node]
+                max_value = int(np.max(class_values))
+                predicted_class = tree.classes_[np.argmax(class_values)]
+
+                # Check if predicted class is an integer
+                if np.issubdtype(type(predicted_class), np.integer):
+                    print(
+                        "{} {} -- train data precision: {:.2f} ({}/{})".format(
+                            indent, predicted_class, max_value / samples, max_value, samples
+                        )
+                    )
+                else:
+                    print(
+                        "{} '{}' -- train data precision: {:.2f} ({}/{})".format(
+                            indent, predicted_class, max_value / samples, max_value, samples
+                        )
+                    )
+            else:
+                prediction = tree_.value[node][0, 0]
+                samples = tree_.n_node_samples[node]
+                print("{} {} -- samples ({})".format(indent, prediction, samples))
 
-    print("Rules used to predict sample {id}:\n".format(id=sample_id))
-    for node_id in range(len(node_index)):
-        id = node_index[node_id]
-        # continue to the next node if it is a leaf node
-        if leaf_id[sample_id] == id:
-            continue
+    print("SELECT")
 
-        # check if value of the split feature for sample 0 is below threshold
-        if sample.iloc[sample_id, feature_index[id]] <= threshold[id]:
-            threshold_sign = "<="
-        else:
-            threshold_sign = ">"
+    recurse(0, 1)
 
-        print(
-            "decision node {node} : ({feature_name} = {value}) "
-            "{inequality} {threshold})".format(
-                node=node_id,
-                sample=sample_id,
-                feature_index=feature_index[id],
-                feature_name=feature_names[feature_index[id]],
-                value=sample.iloc[sample_id, feature[id]],
-                inequality=threshold_sign,
-                threshold=threshold[id],
-            )
-        )
+    print("AS prediction")
+    print("FROM <source_table> -- change to your table name")
 
-        if leaf_id[sample_id] == node_index[node_id + 1]:
-            print('Classification: {classification}'.format(classification=clf.classes_[np.argmax(values[id])]))
 
 def save_model_and_extras(clf, model_name, sql_split, logging):
     # Write printed output to file
-    with open('{model_name}/model/tree_in_sql.sql'.format(model_name=model_name), 'w') as f:
+    with open(
+        "{model_name}/model/tree_in_sql.sql".format(model_name=model_name), "w"
+    ) as f:
         with redirect_stdout(f):
             tree_to_sql(clf)
-    print('SQL version of decision tree saved')
+    print("SQL version of decision tree saved")
diff --git a/scripts/utils/output_scripts/ebm_as_code.py b/scripts/utils/output_scripts/ebm_as_code.py
index b917f29..48d5f3b 100644
--- a/scripts/utils/output_scripts/ebm_as_code.py
+++ b/scripts/utils/output_scripts/ebm_as_code.py
@@ -1,53 +1,80 @@
 import numpy as np
 import pandas as pd
-from interpret.glassbox import ExplainableBoostingClassifier
 from contextlib import redirect_stdout
 
+
 def ReduceSingleFeature(df_):
     # For safety
     df = df_.copy()
 
     # drop any duplicates (which should not exist)
-    df_feat_types = df[['feature','feat_type']].drop_duplicates().reset_index(drop=True).copy()
+    df_feat_types = (
+        df[["feature", "feat_type"]].drop_duplicates().reset_index(drop=True).copy()
+    )
 
     # Set index
-    df = df.set_index(['feature'])
+    df = df.set_index(["feature"])
 
-    # Explode per column 
-    lookup_df = df[['feat_bound', 'score',
-    'score_lower_bound', 'score_upper_bound']].apply(lambda x: x.apply(pd.Series).stack()).reset_index().drop('level_1', axis=1)
+    # Explode per column
+    lookup_df = (
+        df[["feat_bound", "score", "score_lower_bound", "score_upper_bound"]]
+        .apply(lambda x: x.apply(pd.Series).stack())
+        .reset_index()
+        .drop("level_1", axis=1)
+    )
 
     # add feature type back in
-    lookup_df = lookup_df.merge(df_feat_types, on='feature', how='left')
+    lookup_df = lookup_df.merge(df_feat_types, on="feature", how="left")
 
     # sort_values but None will be in the bottom
-    lookup_df.sort_values(['feature','feat_bound'], inplace=True, ascending=False)
+    lookup_df.sort_values(["feature", "feat_bound"], inplace=True, ascending=False)
 
     # So reverse the ordering
     lookup_df = lookup_df.iloc[::-1]
 
-    lookup_df['nr_features'] = 1
+    lookup_df["nr_features"] = 1
 
     # being able for score arrays to be grouped
     # for categorical features do not group by score hence we include value in score_hash
-    lookup_df['pre_hash_column'] = np.where(lookup_df['feat_type'] == 'categorical'
-                                            , lookup_df['score'].astype(str) + lookup_df['feat_bound'].astype(str)
-                                            , lookup_df['score'].astype(str))
-    lookup_df['score_hash'] = pd.util.hash_pandas_object(lookup_df['pre_hash_column'], index=False)
-    hash_lookup_df = lookup_df[['score_hash','score']].drop_duplicates('score_hash').reset_index(drop=True).copy()
+    lookup_df["pre_hash_column"] = np.where(
+        lookup_df["feat_type"] == "categorical",
+        lookup_df["score"].astype(str) + lookup_df["feat_bound"].astype(str),
+        lookup_df["score"].astype(str),
+    )
+    lookup_df["score_hash"] = pd.util.hash_pandas_object(
+        lookup_df["pre_hash_column"], index=False
+    )
+    hash_lookup_df = (
+        lookup_df[["score_hash", "score"]]
+        .drop_duplicates("score_hash")
+        .reset_index(drop=True)
+        .copy()
+    )
 
     # to group by score but keep them in order (not grouping similar scores for different feature values)
     adj_check = (lookup_df.score_hash != lookup_df.score_hash.shift()).cumsum()
 
-    lookup_df['adj_score'] = adj_check
-    lookup_df_simple = lookup_df.groupby(['feature', 'feat_type', 'score_hash', 'adj_score']).agg({'feat_bound':'last'
-                                                ,'score_lower_bound':'first'
-                                                ,'score_upper_bound':'last'
-                                                }, sort=False).reset_index(drop=False)
-
-    lookup_df_grouped = lookup_df_simple.merge(hash_lookup_df, on='score_hash', how='left')
+    lookup_df["adj_score"] = adj_check
+    lookup_df_simple = (
+        lookup_df.groupby(["feature", "feat_type", "score_hash", "adj_score"])
+        .agg(
+            {
+                "feat_bound": "last",
+                "score_lower_bound": "first",
+                "score_upper_bound": "last",
+            },
+            sort=False,
+        )
+        .reset_index(drop=False)
+    )
+
+    lookup_df_grouped = lookup_df_simple.merge(
+        hash_lookup_df, on="score_hash", how="left"
+    )
     # ordering sets None in last place
-    lookup_df_grouped.sort_values(['feature', 'feat_bound'], inplace=True, ascending=False)
+    lookup_df_grouped.sort_values(
+        ["feature", "feat_bound"], inplace=True, ascending=False
+    )
     # So reverse the ordering
     lookup_df_grouped = lookup_df_grouped.iloc[::-1].reset_index(drop=True)
 
@@ -55,7 +82,6 @@ def ReduceSingleFeature(df_):
 
 
 def RestructureReduceInteractions(df_):
-
     # for safety
     df = df_.copy()
 
@@ -63,82 +89,121 @@ def RestructureReduceInteractions(df_):
     # loop over rows
     for index, row in df.iterrows():
         # Swap features position if first feature has more bound values then second feature
-        if (row['score'].shape[0] > row['score'].shape[1]) & (row['feat_type'][0]=='numeric'):
-
+        if (row["score"].shape[0] > row["score"].shape[1]) & (
+            row["feat_type"][0] == "numeric"
+        ):
             # loop over column needed to be transposed
-            for c in ['feature', 'feat_bound', 'score', 'feat_type']:
-                if isinstance(df.loc[index,c], list):
-                    df.at[index,c] = [df.at[index,c][1], df.at[index,c][0]]
-                elif isinstance(df.loc[index,c], np.ndarray):
-                    df.at[index,c] = np.transpose(df.at[index,c])
+            for c in ["feature", "feat_bound", "score", "feat_type"]:
+                if isinstance(df.loc[index, c], list):
+                    df.at[index, c] = [df.at[index, c][1], df.at[index, c][0]]
+                elif isinstance(df.loc[index, c], np.ndarray):
+                    df.at[index, c] = np.transpose(df.at[index, c])
 
     # Reduce
 
     # Split list valued columns into two columns
-    df[['feat_1', 'feat_2']] = df['feature'].apply(pd.Series)
-    df[['feat_bound_1', 'feat_bound_2']] = df['feat_bound'].apply(pd.Series)
-    df[['feat_type_1', 'feat_type_2']] = df['feat_type'].apply(pd.Series)
+    df[["feat_1", "feat_2"]] = df["feature"].apply(pd.Series)
+    df[["feat_bound_1", "feat_bound_2"]] = df["feat_bound"].apply(pd.Series)
+    df[["feat_type_1", "feat_type_2"]] = df["feat_type"].apply(pd.Series)
 
-    # Drop unused column 
-    df = df.drop(['feat_bound'], axis=1)
+    # Drop unused column
+    df = df.drop(["feat_bound"], axis=1)
 
     # Set index
-    df = df.set_index(['feature'])
+    df = df.set_index(["feature"])
 
     # first explode on score and feat_bound_1 (same dimensions)
-    df_explode_1 = df.explode(['score','feat_bound_1'])
-    lookup_df = df_explode_1.explode(['score','feat_bound_2'])
+    df_explode_1 = df.explode(["score", "feat_bound_1"])
+    lookup_df = df_explode_1.explode(["score", "feat_bound_2"])
 
     # sort_values but None will be in the bottom
-    lookup_df = lookup_df.sort_values(['feat_1', 'feat_2','feat_bound_1','feat_bound_2'], ascending=False)
+    lookup_df = lookup_df.sort_values(
+        ["feat_1", "feat_2", "feat_bound_1", "feat_bound_2"], ascending=False
+    )
 
     # So reverse the ordering
     lookup_df = lookup_df.iloc[::-1]
 
-    lookup_df['nr_features'] = 2
+    lookup_df["nr_features"] = 2
 
     # being able for score arrays to be grouped
     # for categorical features do not group by score hence we include value in score_hash
-    mask_category = ['categorical' in x for x in lookup_df['feat_type_2']]
-    mask_inf_bound = [np.PINF == x for x in lookup_df['feat_bound_2']]
+    mask_category = ["categorical" in x for x in lookup_df["feat_type_2"]]
+    mask_inf_bound = [np.PINF == x for x in lookup_df["feat_bound_2"]]
     mask = [a or b for a, b in zip(mask_category, mask_inf_bound)]
 
-    lookup_df['pre_hash_column'] = np.where(mask
-                                            , lookup_df['score'].astype(str) + lookup_df['feat_bound_1'].astype(str) + lookup_df['feat_bound_2'].astype(str)
-                                            , lookup_df['score'].astype(str) + lookup_df['feat_bound_1'].astype(str))
-    lookup_df['score_hash'] = pd.util.hash_pandas_object(lookup_df['pre_hash_column'], index=False)
-    hash_lookup_df = lookup_df[['score_hash','score']].drop_duplicates('score_hash').reset_index(drop=True).copy()
-
+    lookup_df["pre_hash_column"] = np.where(
+        mask,
+        lookup_df["score"].astype(str)
+        + lookup_df["feat_bound_1"].astype(str)
+        + lookup_df["feat_bound_2"].astype(str),
+        lookup_df["score"].astype(str) + lookup_df["feat_bound_1"].astype(str),
+    )
+    lookup_df["score_hash"] = pd.util.hash_pandas_object(
+        lookup_df["pre_hash_column"], index=False
+    )
+    hash_lookup_df = (
+        lookup_df[["score_hash", "score"]]
+        .drop_duplicates("score_hash")
+        .reset_index(drop=True)
+        .copy()
+    )
 
     # to group by score but keep them in order (not grouping similar scores for different feature values)
     adj_check = (lookup_df.score_hash != lookup_df.score_hash.shift()).cumsum()
 
-    lookup_df['adj_score'] = adj_check
-    lookup_df_simple = lookup_df.groupby(['feat_1', 'feat_2', 'feat_type_1', 'feat_type_2', 'score_hash', 'adj_score']).agg({'feat_bound_1':'first'
-                                                , 'feat_bound_2':'last' # last to have numeric bounds correctly (with the existence of inf)
-                                                ,'score_lower_bound':'first'
-                                                ,'score_upper_bound':'last'
-                                                }, sort=False).reset_index(drop=False)
-
-    lookup_df_grouped = lookup_df_simple.merge(hash_lookup_df, on='score_hash', how='left')
+    lookup_df["adj_score"] = adj_check
+    lookup_df_simple = (
+        lookup_df.groupby(
+            [
+                "feat_1",
+                "feat_2",
+                "feat_type_1",
+                "feat_type_2",
+                "score_hash",
+                "adj_score",
+            ]
+        )
+        .agg(
+            {
+                "feat_bound_1": "first",
+                "feat_bound_2": "last",  # last to have numeric bounds correctly (with the existence of inf)
+                "score_lower_bound": "first",
+                "score_upper_bound": "last",
+            },
+            sort=False,
+        )
+        .reset_index(drop=False)
+    )
+
+    lookup_df_grouped = lookup_df_simple.merge(
+        hash_lookup_df, on="score_hash", how="left"
+    )
 
     # ordering sets None in last place
-    lookup_df_grouped.sort_values(['feat_1', 'feat_2','feat_bound_1','feat_bound_2'], inplace=True, ascending=False)
+    lookup_df_grouped.sort_values(
+        ["feat_1", "feat_2", "feat_bound_1", "feat_bound_2"],
+        inplace=True,
+        ascending=False,
+    )
 
     # So reverse the ordering
     lookup_df_grouped = lookup_df_grouped.iloc[::-1].reset_index(drop=True)
 
     # Group second feature to list again for easier SQL writing
-    lookup_df_group_feat2 = lookup_df_grouped.groupby(['feat_1', 'feat_2', 'feat_type_1', 'feat_type_2','feat_bound_1']).agg({
-        'feat_bound_2': list
-        ,'score': list
-    }).reset_index(drop=False)
+    lookup_df_group_feat2 = (
+        lookup_df_grouped.groupby(
+            ["feat_1", "feat_2", "feat_type_1", "feat_type_2", "feat_bound_1"]
+        )
+        .agg({"feat_bound_2": list, "score": list})
+        .reset_index(drop=False)
+    )
 
     return lookup_df_group_feat2
-    
- 
+
+
 def extractLookupTable(ebm):
-    """ Provides reformatted structure of EBM
+    """Provides reformatted structure of EBM
 
     Args:
         ebm: A trained EBM
@@ -150,11 +215,7 @@ def extractLookupTable(ebm):
     # Add per feature graph
     lookup_dicts = []
 
-
-    for feature_group_index, feature_indexes in enumerate(
-            ebm.term_features_
-    ):
-
+    for feature_group_index, feature_indexes in enumerate(ebm.term_features_):
         # below includes treatment for missing values
         model_graph = ebm.term_scores_[feature_group_index]
 
@@ -162,7 +223,6 @@ def extractLookupTable(ebm):
         errors = ebm.standard_deviations_[feature_group_index]
 
         if len(feature_indexes) == 1:
-
             # hack. remove the 0th index which is for missing values
             model_graph = model_graph[1:-1]
             errors = errors[1:-1]
@@ -176,25 +236,25 @@ def extractLookupTable(ebm):
             if isinstance(feature_bins, dict):
                 # categorical
                 feat_bound = list(feature_bins.keys())
-                feat_type = 'categorical'
-        
+                feat_type = "categorical"
+
             else:
                 feat_bound = np.append(feature_bins, np.PINF)
-                feat_type = 'numeric'
-
+                feat_type = "numeric"
 
             score = scores
             score_lower_bound = lower_bounds
             score_upper_bound = upper_bounds
 
-            lookup_dict = {'nr_features': 1
-                           , 'feature':ebm.feature_names[feature_indexes[0]]
-                           , 'feat_bound': feat_bound
-                           , 'score': score
-                           , 'score_lower_bound': score_lower_bound
-                           , 'score_upper_bound': score_upper_bound
-                           , 'feat_type': feat_type
-                           }
+            lookup_dict = {
+                "nr_features": 1,
+                "feature": ebm.feature_names[feature_indexes[0]],
+                "feat_bound": feat_bound,
+                "score": score,
+                "score_lower_bound": score_lower_bound,
+                "score_upper_bound": score_upper_bound,
+                "feat_type": feat_type,
+            }
 
             lookup_dicts.append(lookup_dict)
 
@@ -210,160 +270,200 @@ def extractLookupTable(ebm):
             # Make loop over labels to update the score and features bounds
             # Check for non binary variable
             for b in range(len(feature_indexes)):
-
                 bin_levels = ebm.bins_[feature_indexes[b]]
-                feature_bins = bin_levels[min(len(feature_indexes), len(bin_levels)) - 1]
-            
+                feature_bins = bin_levels[
+                    min(len(feature_indexes), len(bin_levels)) - 1
+                ]
+
                 if isinstance(feature_bins, dict):
                     feat_bound[b] = list(feature_bins.keys())
-                    feat_type[b] = 'categorical'
+                    feat_type[b] = "categorical"
                 else:
-                    feat_bound[b] = np.append(feature_bins, np.PINF) 
-                    feat_type[b] = 'numeric'
-
-            lookup_dict = {'nr_features': 2
-                           , 'feature': [ebm.feature_names[feature_indexes[0]]
-                                        , ebm.feature_names[feature_indexes[1]]]
-                           , 'feat_bound': feat_bound
-                           , 'score': score
-                           , 'feat_type': feat_type
-                            # not implemented for interaction terms
-                           # , 'score_lower_bound': score_lower_bound
-                           # , 'score_upper_bound': score_upper_bound
-                           }
+                    feat_bound[b] = np.append(feature_bins, np.PINF)
+                    feat_type[b] = "numeric"
+
+            lookup_dict = {
+                "nr_features": 2,
+                "feature": [
+                    ebm.feature_names[feature_indexes[0]],
+                    ebm.feature_names[feature_indexes[1]],
+                ],
+                "feat_bound": feat_bound,
+                "score": score,
+                "feat_type": feat_type,
+                # not implemented for interaction terms
+                # , 'score_lower_bound': score_lower_bound
+                # , 'score_upper_bound': score_upper_bound
+            }
 
             lookup_dicts.append(lookup_dict)
 
         else:  # pragma: no cover
             raise Exception("Interactions greater than 2 not supported.")
 
-
     df_of_lists = pd.DataFrame(lookup_dicts)
 
     # we treat single and double features differently
-    df_of_lists_single = df_of_lists[df_of_lists['nr_features']==1].reset_index(drop=True)
-    df_of_lists_double = df_of_lists[df_of_lists['nr_features']==2].reset_index(drop=True)
+    df_of_lists_single = df_of_lists[df_of_lists["nr_features"] == 1].reset_index(
+        drop=True
+    )
+    df_of_lists_double = df_of_lists[df_of_lists["nr_features"] == 2].reset_index(
+        drop=True
+    )
 
     # Reduce Single featuers lookup
     lookup_df_single = ReduceSingleFeature(df_of_lists_single)
 
     # Check if interactions exist
     if len(df_of_lists_double) > 0:
-        # Restructure and reduce double feature df 
+        # Restructure and reduce double feature df
         lookup_df_double = RestructureReduceInteractions(df_of_lists_double)
     else:
         lookup_df_double = None
 
-    return {'intercept': ebm.intercept_, 'feature_single': lookup_df_single, 'feature_double': lookup_df_double}
+    return {
+        "intercept": ebm.intercept_,
+        "feature_single": lookup_df_single,
+        "feature_double": lookup_df_double,
+    }
+
 
-def lookup_df_to_sql(model_name, df_dict, split=True):
+def lookup_df_to_sql(model_name, df_dict, model_type, split):
     # Create list for all feature score names
     feature_list = []
 
     # Start with intercept term
-    intercept = df_dict['intercept'][0]
+    intercept = df_dict["intercept"][0]
     if not split:
-        print(f'"{model_name}" AS model_name \n, ')
-        print(f'{intercept} AS intercept')
+        print("SELECT \n")
+        print(f"'{model_name}' AS model_name \n, ")
+        print(f"{intercept} AS intercept")
     elif split:
         # Creating CTE to create table aliases
-        print('WITH feature_scores AS (\nSELECT')
-        print(f'"{model_name}" AS model_name \n, ')
-        print(f'{intercept} AS intercept')
+        print("WITH feature_scores AS (\nSELECT")
+        print(f"'{model_name}' AS model_name \n, ")
+        print(f"{intercept} AS intercept")
 
-    feature_list.append('intercept')
+    feature_list.append("intercept")
 
     # for single feature
-    single_features = single_feature_handling(df_dict['feature_single'])
+    single_features = single_feature_handling(df_dict["feature_single"])
     feature_list = feature_list + single_features
 
-    if len(df_dict['feature_double']) > 0:
-        double_features = double_feature_sql_handling(df_dict['feature_double'])
+    if len(df_dict["feature_double"]) > 0:
+        double_features = double_feature_sql_handling(df_dict["feature_double"])
         feature_list = feature_list + double_features
 
     if not split:
         # Sum up all separate scores
-        print(', ', end='')
-        print(*feature_list, sep=' + ')
-        print(' AS score')
-        
-        # Applying softmax
-        print(', EXP(score)/(EXP(score) + 1) AS probability')
+        print(", ", end="")
+        print(*feature_list, sep=" + ")
+
+        if model_type == "regression":
+            print(" AS prediction")
+        else:
+            print(" AS score")
+            # Applying softmax
+            print(", EXP(score)/(EXP(score) + 1) AS probability")
+
+        # Add placeholder for source table
+        print("FROM <source_table> -- TODO replace with correct table")
 
     elif split:
         # Add placeholder for source table
-        print('FROM <source_table> -- TODO replace with correct table')
+        print("FROM <source_table> -- TODO replace with correct table")
 
         # Close CTE and create next SELECT statement
-        print('), add_sum_scores AS (')
-        print('SELECT *')
+        print("), add_sum_scores AS (")
+        print("SELECT *")
 
         # Sum up all separate scores
-        print(', ', end='')
-        print(*feature_list, sep=' + ')
-        print(' AS score')
-        print('FROM feature_scores')
+        print(", ", end="")
+        print(*feature_list, sep=" + ")
+
+        if model_type == "regression":
+            print(" AS prediction")
+        else:
+            print(" AS score")
+
+        print("FROM feature_scores")
 
         # Close CTE and make final Select statement
-        print(')')
-        print('SELECT *')
-        # Applying softmax
-        print(', EXP(score)/(EXP(score) + 1) AS probability')
-        print('FROM add_sum_scores')
+        print(")")
+        print("SELECT *")
+
+        if model_type != "regression":
+            # Applying softmax
+            print(", EXP(score)/(EXP(score) + 1) AS probability")
+
+        print("FROM add_sum_scores")
+
 
 def single_feature_handling(df):
     feature_nr = 0
     feature_list = []
-    for f in df['feature'].unique():
-        feature_df = df[df['feature'] == f].reset_index(drop=True)
+    for f in df["feature"].unique():
+        feature_df = df[df["feature"] == f].reset_index(drop=True)
 
         # Each feature score as seperate column
-        print(',\nCASE')
+        print(",\nCASE")
 
         single_feature_2_sql(feature_df, f)
         feature_nr += 1
-        feature_list.append(f'{f}_score')
+        feature_list.append(f"{f}_score")
 
         # feature score alias
-        print(f'AS {f}_score')
+        print(f"AS {f}_score")
 
     return feature_list
 
+
 def single_feature_2_sql(df, feature):
     for index, row in df.iterrows():
         # check if string/category
-        if row['feat_type'] == 'categorical':
+        if row["feat_type"] == "categorical":
             # check for manual imputed null values
-            print(" WHEN {feature} = '{lb}' THEN {score}".format(feature=feature, lb=row['feat_bound'],
-                                                                 score=row['score']))
+            print(
+                " WHEN {feature} = '{lb}' THEN {score}".format(
+                    feature=feature, lb=row["feat_bound"], score=row["score"]
+                )
+            )
             # Add ELSE 0.0 as last entry
             if index == df.index[-1]:
                 print(" ELSE 0.0")
 
         # check for last numeric bound
-        elif row['feat_bound'] == np.PINF:
-            print(' WHEN {feature} >= {lb} THEN {score}'.format(feature=feature,
-                                                                lb=df.iloc[index - 1, :]['feat_bound'],
-                                                                score=row['score']))
+        elif row["feat_bound"] == np.PINF:
+            print(
+                " WHEN {feature} >= {lb} THEN {score}".format(
+                    feature=feature,
+                    lb=df.iloc[index - 1, :]["feat_bound"],
+                    score=row["score"],
+                )
+            )
             # Add ELSE 0.0 as last entry
             if index == df.index[-1]:
                 print(" ELSE 0.0")
 
         # otherwise it should be a float
-        elif isinstance(row['feat_bound'], float):
+        elif isinstance(row["feat_bound"], float):
             # First bound
             if index == 0:
-                print(' WHEN {feature} <= {ub} THEN {score}'.format(feature=feature,
-                                                                    ub=row['feat_bound'],
-                                                                    score=row['score']))
+                print(
+                    " WHEN {feature} <= {ub} THEN {score}".format(
+                        feature=feature, ub=row["feat_bound"], score=row["score"]
+                    )
+                )
 
             else:
-                print(' WHEN {feature} > {lb} AND {feature} <= {ub} THEN {score}'.format(feature=feature,
-                                                                                         lb=
-                                                                                         df.iloc[index - 1, :][
-                                                                                             'feat_bound'],
-                                                                                         ub=row['feat_bound'],
-                                                                                         score=row['score']))
+                print(
+                    " WHEN {feature} > {lb} AND {feature} <= {ub} THEN {score}".format(
+                        feature=feature,
+                        lb=df.iloc[index - 1, :]["feat_bound"],
+                        ub=row["feat_bound"],
+                        score=row["score"],
+                    )
+                )
             # Add ELSE 0.0 as last entry
             if index == df.index[-1]:
                 print(" ELSE 0.0")
@@ -371,224 +471,301 @@ def single_feature_2_sql(df, feature):
         else:
             raise "not sure what to do"
 
-    print('END')
+    print("END")
 
-def double_feature_sql_handling(df):
 
+def double_feature_sql_handling(df):
     feature_nr = 0
     feature_list = []
-    df['double_feature'] = df['feat_1'] + '_x_' + df['feat_2']
-    for f in df['double_feature'].unique():
-        feature_df = df[df['double_feature'] == f].reset_index(drop=True)
+    df["double_feature"] = df["feat_1"] + "_x_" + df["feat_2"]
+    for f in df["double_feature"].unique():
+        feature_df = df[df["double_feature"] == f].reset_index(drop=True)
 
         # Each double feature score as case statement
-        print(',\nCASE')
+        print(",\nCASE")
 
         double_feature_2_sql(feature_df, f)
         feature_nr += 1
-        feature_list.append(f'{f}_score')
+        feature_list.append(f"{f}_score")
 
         # feature score alias
-        print(f'AS {f}_score')
+        print(f"AS {f}_score")
 
     return feature_list
 
+
 def double_feature_2_sql(df, double_feature):
     for index, row in df.iterrows():
         # check if string/category
-        if row['feat_type_1'] == 'categorical':
-            print(" WHEN {feature} = '{lb}' THEN \n     CASE".format(feature=row['feat_1'], lb=row['feat_bound_1']))
+        if row["feat_type_1"] == "categorical":
+            print(
+                " WHEN {feature} = '{lb}' THEN \n     CASE".format(
+                    feature=row["feat_1"], lb=row["feat_bound_1"]
+                )
+            )
 
         # check for last numeric bound
-        elif row['feat_bound_1'] == np.PINF:
-            print(' WHEN {feature} >= {lb} THEN \n      CASE'.format(feature=row['feat_1'],
-                                                                lb=df.loc[index - 1, 'feat_bound_1']))
+        elif row["feat_bound_1"] == np.PINF:
+            print(
+                " WHEN {feature} >= {lb} THEN \n      CASE".format(
+                    feature=row["feat_1"], lb=df.loc[index - 1, "feat_bound_1"]
+                )
+            )
 
         # otherwise it should be a float
-        elif isinstance(row['feat_bound_1'], float):
+        elif isinstance(row["feat_bound_1"], float):
             # First bound
             if index == 0:
-                print(' WHEN {feature} <= {ub} THEN \n      CASE'.format(feature=row['feat_1'],
-                                                                    ub=row['feat_bound_1']))
+                print(
+                    " WHEN {feature} <= {ub} THEN \n      CASE".format(
+                        feature=row["feat_1"], ub=row["feat_bound_1"]
+                    )
+                )
 
             else:
-                print(' WHEN {feature} > {lb} AND {feature} <= {ub} THEN \n     CASE'.format(feature=row['feat_1'],
-                                                                                            lb=
-                                                                                            df.loc[index - 1,'feat_bound_1'],
-                                                                                            ub=row['feat_bound_1']))
+                print(
+                    " WHEN {feature} > {lb} AND {feature} <= {ub} THEN \n     CASE".format(
+                        feature=row["feat_1"],
+                        lb=df.loc[index - 1, "feat_bound_1"],
+                        ub=row["feat_bound_1"],
+                    )
+                )
 
         else:
             raise "not sure what to do"
-        
-        # Nr of bound values 
-        nr_bounds = len(row['feat_bound_2'])
+
+        # Nr of bound values
+        nr_bounds = len(row["feat_bound_2"])
 
         # Looping over the bound values for the second feature
         for sf_index in range(nr_bounds):
-
             # check if string/category
-            if row['feat_type_2'] == 'categorical':
+            if row["feat_type_2"] == "categorical":
                 # check for manual imputed null values
-                print("         WHEN {feature} = '{lb}' THEN {score}".format(feature=row['feat_2'], 
-                                                                    lb=row['feat_bound_2'][sf_index - 1],
-                                                                    score=row['score'][sf_index]))
+                print(
+                    "         WHEN {feature} = '{lb}' THEN {score}".format(
+                        feature=row["feat_2"],
+                        lb=row["feat_bound_2"][sf_index - 1],
+                        score=row["score"][sf_index],
+                    )
+                )
 
             # check for last numeric bound
-            elif row['feat_bound_2'][sf_index] == np.PINF:
-                print('         WHEN {feature} >= {lb} THEN {score}'.format(feature=row['feat_2'],
-                                                                    lb=row['feat_bound_2'][sf_index - 1],
-                                                                    score=row['score'][sf_index]))
+            elif row["feat_bound_2"][sf_index] == np.PINF:
+                print(
+                    "         WHEN {feature} >= {lb} THEN {score}".format(
+                        feature=row["feat_2"],
+                        lb=row["feat_bound_2"][sf_index - 1],
+                        score=row["score"][sf_index],
+                    )
+                )
 
             # otherwise it should be a float
-            elif isinstance(row['feat_bound_2'][sf_index], float):
+            elif isinstance(row["feat_bound_2"][sf_index], float):
                 # First bound
                 if sf_index == 0:
-                    print('         WHEN {feature} <= {ub} THEN {score}'.format(feature=row['feat_2'],
-                                                                        ub=row['feat_bound_2'][sf_index],
-                                                                        score=row['score'][sf_index]))
+                    print(
+                        "         WHEN {feature} <= {ub} THEN {score}".format(
+                            feature=row["feat_2"],
+                            ub=row["feat_bound_2"][sf_index],
+                            score=row["score"][sf_index],
+                        )
+                    )
 
                 else:
-                    print('         WHEN {feature} > {lb} AND {feature} <= {ub} THEN {score}'.format(feature=row['feat_2'],
-                                                                                            lb=row['feat_bound_2'][sf_index - 1],
-                                                                                            ub=row['feat_bound_2'][sf_index],
-                                                                                            score=row['score'][sf_index]))
+                    print(
+                        "         WHEN {feature} > {lb} AND {feature} <= {ub} THEN {score}".format(
+                            feature=row["feat_2"],
+                            lb=row["feat_bound_2"][sf_index - 1],
+                            ub=row["feat_bound_2"][sf_index],
+                            score=row["score"][sf_index],
+                        )
+                    )
 
             else:
                 raise "not sure what to do"
-            
+
             # Add ELSE 0.0 as last entry
             if sf_index + 1 == nr_bounds:
                 print("         ELSE 0.0")
 
-        print('     END')
+        print("     END")
     # Catch anything else
-    print(' ELSE 0.0')
-    print('END')
+    print(" ELSE 0.0")
+    print("END")
 
 
 def lookup_df_to_sql_multiclass(model_name, df, classes, split):
+    df_single = df["feature_single"]
+    intercepts = df["intercept"]
     
-    print(f'"{model_name}" AS model_name \n, ')
-    
+    if split:
+        # Add starting cte
+        print("WITH feature_scores AS (")
+
+    print("SELECT")
+    print(f"'{model_name}' AS model_name")
+    # Add intercepts
+    for i, c in enumerate(classes):
+        print(f", {intercepts[i]} AS intercept_{c}")
+
+
     class_nr = 0
     feature_list = {}
     for c in classes:
         feature_nr = 0
         feature_list[c] = []
-        for f in df['feature'].unique():
-            feature_df = df[df['feature'] == f].reset_index(drop=True)
 
-            if (feature_nr == 0) & (class_nr == 0):
-                print('CASE')
-            elif (feature_nr == 0) & (class_nr > 0):
-                print(', CASE')
-            else:
-                print(',\nCASE')
+        ## Add intercept to feature list
+        feature_list[c].append(f"intercept_{c}")
+
+        for f in df_single["feature"].unique():
+            feature_df = df_single[df_single["feature"] == f].reset_index(drop=True)
 
             single_feature_2_sql_multiclass(feature_df, f, class_nr)
 
             # Feature score as alias
-            print(f'AS {f}_score_{c}')
-            feature_list[c].append(f'{f}_score_{c}')
+            print(f"AS {f}_score_{c}")
+            feature_list[c].append(f"{f}_score_{c}")
 
             feature_nr += 1
         class_nr += 1
 
     if split:
         # Add placeholder for source table
-        print('FROM <source_table> -- TODO replace with correct table')
+        print("FROM <source_table> -- TODO replace with correct table")
         # Close CTE and create next SELECT statement
-        print('), add_sum_scores AS (')
-        print('SELECT *')
+        print("), add_sum_scores AS (")
+        print("SELECT *")
 
-    
     if not split:
         for c in classes:
             # Sum up all separate scores
-            print(', ', end='')
-            print(*feature_list[c], sep=' + ')
-            print(f' AS score_{c}')
+            print(", ", end="")
+            print(*feature_list[c], sep=" + ")
+            print(f" AS score_{c}")
 
     elif split:
         for c in classes:
             # Create CTE with sums of all features scores per class
-            print(', ', end='')
-            print(*feature_list[c], sep=' + ')
-            print(f' AS score_{c}')
+            print(", ", end="")
+            print(*feature_list[c], sep=" + ")
+            print(f" AS score_{c}")
         # From CTE
-        print('FROM feature_scores')
+        print("FROM feature_scores")
 
     # Summing feature scores to total score per class
     if not split:
         for c in classes:
             if c == classes[0]:
-                print(f', EXP(score_{c})', end='')
+                print(f", EXP(score_{c})", end="")
             else:
-                print(f' + EXP(score_{c})', end='')
-        print(' AS total_score')
+                print(f" + EXP(score_{c})", end="")
+        print(" AS total_score")
 
     elif split:
         # Close CTE and create next SELECT statement
-        print('), add_sum_all_scores AS (')
-        print('SELECT *')
+        print("), add_sum_all_scores AS (")
+        print("SELECT *")
 
         for c in classes:
             if c == classes[0]:
-                print(f', EXP(score_{c})', end='')
+                print(f", EXP(score_{c})", end="")
             else:
-                print(f' + EXP(score_{c})', end='')
-        print(' AS total_score')
-        
+                print(f" + EXP(score_{c})", end="")
+        print(" AS total_score")
+
+        # Check class with highest score
+
+        #Get max score
+        print(f", GREATEST({', '.join([f'score_{i}' for i in classes])}) AS max_score")
+                                                           
+
         # Close CTE and create final SELECT statement
-        print('FROM add_sum_scores')
-        print(')')
-        print('SELECT *')
+        print("FROM add_sum_scores")
+        print(")")
+        print("SELECT *")
 
-        
     # Applying softmax
     if not split:
         for c in classes:
-            print(f', EXP(score_{c}) / (total_score) AS probability_{c}', end='\n')
-    elif split: 
+            print(f", EXP(score_{c}) / (total_score) AS probability_{c}", end="\n")
+
+        
+        print(f", GREATEST({', '.join([f'probability_{i}' for i in classes])}) AS max_probability")
+
+        print(", CASE")
+        for c in classes:
+            print(f"\t WHEN probability_{c} = max_probability THEN '{c}'")
+        print("END AS prediction")
+
+        # Add placeholder for source table
+        print("FROM <source_table> -- TODO replace with correct table")
+    elif split:
+        for c in classes:
+            print(f", EXP(score_{c}) / (total_score) AS probability_{c}", end="\n")
+        
+        print(f", EXP(max_score) / (total_score) AS max_probability")
+
+        print(", CASE")
         for c in classes:
-            print(f', EXP(score_{c}) / (total_score) AS probability_{c}', end='\n')
-        print('FROM add_sum_all_scores')
+            print(f"\t WHEN score_{c} = max_score THEN '{c}'")
+        print("END AS prediction")
+
+        print("FROM add_sum_all_scores")
+
 
 def single_feature_2_sql_multiclass(df, feature, class_nr):
+    # Start new case statement
+    print(",\nCASE")
+
     for index, row in df.iterrows():
         # check if string/category
-        if row['feat_type'] == 'categorical':
+        if row["feat_type"] == "categorical":
             # check for manual imputed null values
-            print(" WHEN {feature} = '{lb}' THEN {score}".format(feature=feature, lb=row['feat_bound'],
-                                                                 score=row['score'][class_nr]))
+            print(
+                " WHEN {feature} = '{lb}' THEN {score}".format(
+                    feature=feature, lb=row["feat_bound"], score=row["score"][class_nr]
+                )
+            )
             # Add ELSE 0.0 as last entry
             if index == df.index[-1]:
                 print(" ELSE 0.0")
 
         # check for last numeric bound
-        elif row['feat_bound'] == np.PINF:
-            print(' WHEN {feature} >= {lb} THEN {score}'.format(feature=feature,
-                                                                lb=df.iloc[index - 1, :]['feat_bound'],
-                                                                score=row['score'][class_nr]))
+        elif row["feat_bound"] == np.PINF:
+            print(
+                " WHEN {feature} >= {lb} THEN {score}".format(
+                    feature=feature,
+                    lb=df.iloc[index - 1, :]["feat_bound"],
+                    score=row["score"][class_nr],
+                )
+            )
             # Add ELSE 0.0 as last entry
             if index == df.index[-1]:
                 print(" ELSE 0.0")
 
         # otherwise it should be a float
-        elif isinstance(row['feat_bound'], float):
+        elif isinstance(row["feat_bound"], float):
             # First bound
             if index == 0:
-                print(' WHEN {feature} <= {ub} THEN {score}'.format(feature=feature,
-                                                                    ub=row['feat_bound'],
-                                                                    score=row['score'][class_nr]))
+                print(
+                    " WHEN {feature} <= {ub} THEN {score}".format(
+                        feature=feature,
+                        ub=row["feat_bound"],
+                        score=row["score"][class_nr],
+                    )
+                )
 
             else:
-                print(' WHEN {feature} > {lb} AND {feature} <= {ub} THEN {score}'.format(feature=feature,
-                                                                                         lb=
-                                                                                         df.iloc[index - 1, :][
-                                                                                             'feat_bound'],
-                                                                                         ub=row['feat_bound'],
-                                                                                         score=row['score'][class_nr]))
+                print(
+                    " WHEN {feature} > {lb} AND {feature} <= {ub} THEN {score}".format(
+                        feature=feature,
+                        lb=df.iloc[index - 1, :]["feat_bound"],
+                        ub=row["feat_bound"],
+                        score=row["score"][class_nr],
+                    )
+                )
             # Add ELSE 0.0 as last entry
             if index == df.index[-1]:
                 print(" ELSE 0.0")
@@ -596,13 +773,18 @@ def single_feature_2_sql_multiclass(df, feature, class_nr):
         else:
             raise "not sure what to do"
 
-    print('END')
+    print("END")
+
 
 def ebm_to_sql(model_name, df, classes, split=True):
     if len(classes) > 2:
-        lookup_df_to_sql_multiclass(model_name, df['feature_single'], classes, split)
+        lookup_df_to_sql_multiclass(model_name, df, classes, split)
+    elif len(classes) == 1:
+        model_type = "regression"
+        lookup_df_to_sql(model_name, df, model_type, split)
     else:
-        lookup_df_to_sql(model_name, df, split)
+        model_type = "binary"
+        lookup_df_to_sql(model_name, df, model_type, split)
 
 
 def save_model_and_extras(ebm, model_name, split, logging):
@@ -610,14 +792,13 @@ def save_model_and_extras(ebm, model_name, split, logging):
     lookup_df = extractLookupTable(ebm)
 
     # In case of regression
-    if not hasattr(ebm, 'classes_'):
+    if not hasattr(ebm, "classes_"):
         ebm.classes_ = [0]
-        lookup_df['intercept'] = [lookup_df['intercept']]
+        lookup_df["intercept"] = [lookup_df["intercept"]]
 
     # Write printed output to file
-    with open('{model_name}/model/ebm_in_sql.sql'.format(model_name=model_name), 'w') as f:
+    with open(f"{model_name}/model/ebm_in_sql.sql", "w") as f:
         with redirect_stdout(f):
-            model_name = model_name.split('/')[1]
+            model_name = model_name.split("/")[-1]
             ebm_to_sql(model_name, lookup_df, ebm.classes_, split)
-    print('SQL version of EBM saved')
-    logging.info('SQL version of EBM saved')
\ No newline at end of file
+    logging.info("SQL version of EBM saved")
diff --git a/scripts/utils/output_scripts/l_regression_as_code.py b/scripts/utils/output_scripts/l_regression_as_code.py
new file mode 100644
index 0000000..649644c
--- /dev/null
+++ b/scripts/utils/output_scripts/l_regression_as_code.py
@@ -0,0 +1,200 @@
+from contextlib import redirect_stdout
+
+
+def extract_parameters(model):
+    """
+    Extracts model_type, features, coefficients, and intercept from a trained logistic regression model.
+
+    Parameters:
+    - trained_model: The trained logistic regression model object.
+
+    Returns:
+    - model_type: String, either regression of classification
+    - features: List of feature names.
+    - coefficients: List of coefficients corresponding to each feature.
+    - intercept: Intercept of the logistic regression model.
+    """
+    try:
+        # Extract model type
+        if model.__class__.__name__ == "LinearRegression":
+            model_type = 'regression'
+            pclasses = None
+        elif len(model.classes_) > 2:
+            model_type = 'multiclass'
+            pclasses = model.classes_
+        elif len(model.classes_) == 2:
+            model_type = 'binary'
+            pclasses = model.classes_
+
+        # Extract features
+        features = model.feature_names_in_
+
+        
+        if model_type == "binary":
+            coefficients = model.sk_model_.coef_[0]
+        else:
+            coefficients = model.sk_model_.coef_
+
+        # Extract intercept
+        if model_type == "binary":
+            intercept = model.sk_model_.intercept_[0]
+        else:
+            intercept = model.sk_model_.intercept_
+
+        return model_type, pclasses, features, coefficients, intercept
+
+    except Exception as e:
+        # Handle exceptions based on your specific model or library
+        print(f"Error extracting parameters: {str(e)}")
+        return None, None, None, None, None
+
+
+def format_sql(model_name, model_type, pclasses, features, coefficients, intercept, split):
+    # List of column aliases of the scores of the different features
+    if model_type == 'multiclass':
+        score_cols = {}
+        for i, c in enumerate(pclasses):
+            score_cols[c] = " + ".join(
+                [f"{feature}_score_{c}" for feature in features]
+            )    
+    else:
+        score_cols = " + ".join(
+            [f"{feature}_score" for feature in features]
+        )
+
+    # Include the individual score per feature in the SELECT clause
+    if model_type == 'multiclass':
+        feature_scores = {}
+        for i, c in enumerate(pclasses):
+            feature_scores[c] = "\t, ".join(
+                [
+                    f"({coef} * {feature}) AS {feature}_score_{c}\n"
+                    for coef, feature in zip(coefficients[i], features)
+                ]
+            ) 
+    else:
+        feature_scores = "\t, ".join(
+            [
+                f"({coef} * {feature}) AS {feature}_score\n"
+                for coef, feature in zip(coefficients, features)
+            ]
+        )
+
+    # Create the SQL query with the logistic regression formula and feature scores
+    if not split:
+        print("SELECT")
+        print(f"\t'{model_name}' AS model_name")
+
+        if model_type == "regression":
+            print(f"\t, {intercept} AS intercept")
+            print(f"\t, {feature_scores}", end="")
+            print(f"\t, {score_cols} + intercept AS prediction")
+        elif model_type == 'binary':
+            print(f"\t, {intercept} AS intercept")
+            print(f"\t, {feature_scores}", end="")
+            print(
+                f"\t, {score_cols} + {intercept} AS score"
+            )
+            print(
+                f"\t, 1 / (1 + EXP(-(score))) AS probability"
+            )
+        elif model_type == 'multiclass':
+            for i, c in zip(intercept, pclasses):
+                print(f"\t, {i} AS intercept_{c}")
+            
+            for c in pclasses:
+                print(f"\t, {feature_scores[c]}", end="")
+            
+            for c in pclasses:
+                print(
+                    f"\t, {score_cols[c]} + intercept_{c} AS score_{c}"
+                )
+
+            print('\t, (EXP(', end="")
+            class_score_list = [f"score_{c}" for c in pclasses]
+            print(*class_score_list, sep=") + EXP(", end=")) AS total_score\n")
+
+
+            for c in pclasses:    
+                print(
+                    f"\t, EXP(score_{c}) / total_score AS probability_{c}"
+                )
+
+        print("FROM <source_table>;  -- TODO replace with correct table")
+
+    elif split:
+        # Creating CTE to create table aliases
+        print("WITH feature_scores AS (\nSELECT")
+        print(f"\t'{model_name}' AS model_name")
+
+
+        if model_type == "regression":
+            print(f"\t, {intercept} AS intercept")
+            print(f"\t, {feature_scores}", end="")
+        elif model_type == 'binary':
+            print(f"\t, {intercept} AS intercept")
+            print(f"\t, {feature_scores}", end="")
+        elif model_type == 'multiclass':
+            for i, c in zip(intercept, pclasses):
+                print(f"\t, {i} AS intercept_{c}")
+            
+            for c in pclasses:
+                print(f"\t, {feature_scores[c]}", end="")
+            
+
+        # Add placeholder for source table
+        print("FROM <source_table> -- TODO replace with correct table")
+
+        # Close CTE and create next SELECT statement
+        print("), add_sum_scores AS (")
+        print("SELECT *")
+
+
+        if model_type == "regression":
+            print(f"\t, {score_cols} + intercept AS prediction")
+        elif model_type == 'binary':
+            print(
+                f"\t, {score_cols} + intercept AS score"
+            )
+        elif model_type == 'multiclass':
+            # scores per class
+            for c in pclasses:
+                print(
+                    f"\t, {score_cols[c]} + intercept_{c} AS score_{c}"
+                )
+            class_score_list = [f"score_{c}" for c in pclasses]
+            print('\t, (EXP(', end="")
+            print(*class_score_list, sep=") + EXP(", end=")) AS total_score\n")
+
+        print("FROM feature_scores")
+
+        # Close CTE and make final Select statement
+        print(")")
+        print("SELECT *")
+
+        if model_type == 'binary':
+            # TODO adjust accordingly for multiclass
+            # Applying softmax
+            print(", 1 / (1 + EXP(-score)) AS probability")
+        elif model_type == 'multiclass':
+            for c in pclasses:
+                print(
+                    f"\t, EXP(score_{c})/total_score AS probability_{c}"
+                ) 
+
+        print("FROM add_sum_scores")
+    return
+
+
+def save_model_and_extras(clf, model_name, sql_split, logging):
+    model_type, pclasses, features, coefficients, intercept = extract_parameters(clf)
+    # Write printed output to file
+    with open(
+        "{model_name}/model/lregression_in_sql.sql".format(model_name=model_name), "w"
+    ) as f:
+        with redirect_stdout(f):
+            model_name = model_name.split("/")[-1]
+            format_sql(
+                model_name, model_type, pclasses, features, coefficients, intercept, sql_split
+            )
+    logging.info("SQL version of logistic/linear regression saved")
diff --git a/scripts/utils/pre_processing/pre_process.py b/scripts/utils/pre_processing/pre_process.py
index 3ed35d2..94fc3c0 100644
--- a/scripts/utils/pre_processing/pre_process.py
+++ b/scripts/utils/pre_processing/pre_process.py
@@ -1,16 +1,24 @@
 import pandas as pd
 import numpy as np
-from sklearn.model_selection import train_test_split
 from imblearn.over_sampling import RandomOverSampler, SMOTE, SMOTENC
-from utils.feature_selection.correlations import *
+from utils.feature_selection.correlations import (
+    plotPearsonCorrelation,
+    plotCramervCorrelation,
+)
 
-def cleanAndCastColumns(data, feature_cols, target_col, model_name, model_type, logging):
+
+def cleanAndCastColumns(
+    data, feature_cols, target_col, model_name, model_type, logging
+):
     # make copy of data
     _data = data.copy()
 
     # clean out where target is NaN
-    print('\nRows being removed due to NaN in target column: {nans} \n'.format(nans=len(_data[_data[target_col].isna()])))
-    logging.info('Rows being removed due to NaN in target column: {nans} \n'.format(nans=len(_data[_data[target_col].isna()])))
+    logging.info(
+        "Rows being removed due to NaN in target column: {nans} \n".format(
+            nans=len(_data[_data[target_col].isna()])
+        )
+    )
 
     _data = _data.loc[_data[target_col].notna(), :].reset_index(drop=True)
 
@@ -19,53 +27,68 @@ def cleanAndCastColumns(data, feature_cols, target_col, model_name, model_type,
 
     if len(one_nunique) > 0:
         _data = _data.loc[:, ~_data.columns.isin(one_nunique)]
-        print(f'\nFeatures being removed due to single unique value: {one_nunique} \n')
-        logging.info(f'Features being removed due to single unique value: {one_nunique} \n')
+        logging.info(
+            f"Features being removed due to single unique value: {one_nunique} \n"
+        )
 
         # Remove feature from feature_cols if in there
         for f in one_nunique:
             if f in feature_cols:
                 feature_cols.remove(f)
 
-    if model_type == 'classification':
+    if model_type == "classification":
         # Remove classes with only one occurence
-        one_occurence_class = _data[target_col].value_counts()[_data[target_col].value_counts() == 1].index
+        one_occurence_class = (
+            _data[target_col]
+            .value_counts()[_data[target_col].value_counts() == 1]
+            .index
+        )
         if len(one_occurence_class) > 0:
             _data = _data[~_data[target_col].isin(one_occurence_class)]
 
-            print('Removed class {classification} due to having only 1 observation \n'.format(classification=one_occurence_class))
-            logging.info('Removed class {classification} due to having only 1 observation'.format(classification=one_occurence_class))
-
+            logging.info(
+                "Removed class {classification} due to having only 1 observation".format(
+                    classification=one_occurence_class
+                )
+            )
 
     # Imputing missing values and casting
     # assuming only int/float and bool column types
-    nan_cols = _data[feature_cols][_data[feature_cols].columns[_data[feature_cols].isna().sum() > 0]]
+    nan_cols = _data[feature_cols][
+        _data[feature_cols].columns[_data[feature_cols].isna().sum() > 0]
+    ]
     if len(nan_cols) > 0:
-        print('Columns with NaN values: \n{nans} \n'.format(nans=nan_cols.isna().sum()))
-        logging.info('Columns with NaN values: \n{nans}'.format(nans=nan_cols.isna().sum()))
+        logging.info(
+            "Columns with NaN values: \n{nans}".format(nans=nan_cols.isna().sum())
+        )
 
     # Adjust this to allow for categorical features
-    for col in _data[feature_cols].select_dtypes(include=['object']).columns:
+    for col in _data[feature_cols].select_dtypes(include=["object"]).columns:
         # Check if values are true/false/None then boolean
         if all(val in [True, False, None, np.NaN] for val in _data[col].unique()):
             _data[col] = _data[col].astype(int)
         else:  # otherwise assume categorical
-            _data[col] = _data[col].astype({col: 'category'})
+            _data[col] = _data[col].astype({col: "category"})
 
-    if model_name != 'ebm': # otherwise model can't handle categorical features
-        cat_col = _data[feature_cols].select_dtypes(include=['category']).columns
-        print(f'\nFeatures being removed due to type being categorical: {cat_col} \n')
-        logging.info(f'Features being removed due to  type being categorical: {cat_col} \n')
+    if model_name != "ebm":  # otherwise model can't handle categorical features
+        cat_col = _data[feature_cols].select_dtypes(include=["category"]).columns
+        logging.info(
+            f"Features being removed due to  type being categorical: {cat_col} \n"
+        )
         # Remove feature from feature_cols if in there
         for f in cat_col:
             if f in feature_cols:
                 feature_cols.remove(f)
 
     # Overview of _data types
-    print('Column types in data set (including target)\n{col_types} \n'.format(col_types=_data[feature_cols].dtypes.value_counts()))
+    logging.info(
+        "Column types in data set (including target)\n{col_types} \n".format(
+            col_types=_data[feature_cols].dtypes.value_counts()
+        )
+    )
 
     # change boolean into 0's and 1's
-    for col in _data[feature_cols].select_dtypes(include=['bool']).columns:
+    for col in _data[feature_cols].select_dtypes(include=["bool"]).columns:
         _data[col] = _data[col].astype(int)
 
     return _data.reset_index(drop=True)
@@ -78,40 +101,53 @@ def imbalanceness(labels):
     total_size = classes_count.sum()
     nclasses = len(classes_count)
 
-    return (max_class_size - min_class_size)/(total_size - nclasses)
-
-def pre_process_kfold(given_name, data, target_col, feature_cols, model_name, model_type, logging, pre_params, post_params, random_seed=42):
-
+    return (max_class_size - min_class_size) / (total_size - nclasses)
+
+
+def pre_process_kfold(
+    given_name,
+    data,
+    target_col,
+    feature_cols,
+    model_name,
+    model_type,
+    logging,
+    pre_params,
+    post_params,
+    random_seed=42,
+):
     # clean and cast
-    data_clean = cleanAndCastColumns(data, feature_cols, target_col, model_name, model_type, logging)
+    data_clean = cleanAndCastColumns(
+        data, feature_cols, target_col, model_name, model_type, logging
+    )
 
     # Limit dataset with respect to the max_rows parameter
-    if 'max_rows' in pre_params:
-        max_rows = min(pre_params['max_rows'], len(data_clean))
+    if "max_rows" in pre_params:
+        max_rows = min(pre_params["max_rows"], len(data_clean))
         data_clean = data_clean.sample(n=max_rows).reset_index(drop=True)
-        print(f'Limited dataset to {max_rows}')
-        logging.info(f'Limited dataset to {max_rows}')
+        logging.info(f"Limited dataset to {max_rows}")
 
     # Create correlation plots
-    plotPearsonCorrelation(data_clean[feature_cols], given_name, post_params['file_type'], logging)
-    plotCramervCorrelation(data_clean[feature_cols], given_name, post_params['file_type'], logging)
+    plotPearsonCorrelation(
+        data_clean[feature_cols], given_name, post_params["file_type"], logging
+    )
+    plotCramervCorrelation(
+        data_clean[feature_cols], given_name, post_params["file_type"], logging
+    )
 
     # create kfolds in a statified manner
     from sklearn.model_selection import StratifiedKFold, KFold, TimeSeriesSplit
 
     # initiate kfold
-    if pre_params['cv_type'] == 'timeseriesplit':
-        print('Performing time series split cross validation')
-        logging.info('Performing time series split cross validation')
-        data.sort_values(pre_params['time_sensitive_column'], inplace=True)
+    if pre_params["cv_type"] == "timeseriesplit":
+        logging.info("Performing time series split cross validation")
+        data.sort_values(pre_params["time_sensitive_column"], inplace=True)
         kfold = TimeSeriesSplit(n_splits=5)
-    elif model_type == 'classification':
-        print('Performing stratified kfold cross validation')
-        logging.info('Performing stratified kfold cross validation')
+    elif model_type == "classification":
+        logging.info("Performing stratified kfold cross validation")
         kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=random_seed)
-    elif model_type == 'regression':
-        print('Performing normal kfold cross validation')
-        logging.info('Performing normal kfold cross validation')
+    elif model_type == "regression":
+        logging.info("Performing normal kfold cross validation")
         kfold = KFold(n_splits=5, shuffle=True, random_state=random_seed)
 
     # Create initial dict to collect datasets
@@ -121,7 +157,7 @@ def pre_process_kfold(given_name, data, target_col, feature_cols, model_name, mo
     y = data_clean[target_col]
     X = data_clean[feature_cols]
 
-    if pre_params['upsampling'] != 'false':
+    if pre_params["upsampling"] != "false":
         #### Create upsampled version of full dataset for final training
         # Make sure total rows * columns after upsampling won't hit x nr of cells
         max_cells = 50000
@@ -131,20 +167,21 @@ def pre_process_kfold(given_name, data, target_col, feature_cols, model_name, mo
         X_ups, y_ups = upsampleData(X, y_trim, model_type, logging, random_seed=42)
 
         # Add to datasets
-        datasets['final_train'] = {'X': X_ups, 'y': y_ups}
+        datasets["final_train"] = {"X": X_ups, "y": y_ups}
     else:
         # Add to datasets
-        datasets['final_train'] = {'X': X, 'y': y}
+        datasets["final_train"] = {"X": X, "y": y}
     ####
 
-
     #### Create OOT dataset if wanted
-    if pre_params['oot_set'] != 'false':
-        oot_df = data_clean.sort_values(pre_params['time_sensitive_column'], ascending=True).tail(pre_params['oot_rows'])
+    if pre_params["oot_set"] != "false":
+        oot_df = data_clean.sort_values(
+            pre_params["time_sensitive_column"], ascending=True
+        ).tail(pre_params["oot_rows"])
         X_oot = oot_df[feature_cols]
         y_oot = oot_df[target_col]
 
-        datasets['oot'] = {'X': X_oot, 'y': y_oot}
+        datasets["oot"] = {"X": X_oot, "y": y_oot}
 
         # set new X and y data apart (oot excluded)
         data_wo_oot = pd.concat([data_clean, oot_df]).drop_duplicates(keep=False)
@@ -152,47 +189,49 @@ def pre_process_kfold(given_name, data, target_col, feature_cols, model_name, mo
         y = data_wo_oot[target_col]
     ####
 
-
     #### Create datasets based on the different folds
     # listing the different folds
-    X_train_list, X_train_ups_list, X_test_list, y_train_list, y_train_ups_list, y_test_list = list(), list(), list(), list(), list(), list()
+    X_train_list, X_test_list, y_train_list, y_test_list = (
+        list(),
+        list(),
+        list(),
+        list(),
+    )
 
     # enumerate the splits and summarize the distributions
     kfold_nr = 0
     for train_ix, test_ix in kfold.split(X, y):
         # Record kfold
-        print(f'\nCreating fold nr {kfold_nr+1}')
-        logging.info(f'Creating fold nr {kfold_nr+1}')
+        logging.info(f"Creating fold nr {kfold_nr+1}")
 
         # select rows
-        X_train, X_test = X.iloc[train_ix,:], X.iloc[test_ix,:]
+        X_train, X_test = X.iloc[train_ix, :], X.iloc[test_ix, :]
         y_train, y_test = y[train_ix], y[test_ix]
 
-        if pre_params['upsampling'] != 'false':
+        if pre_params["upsampling"] != "false":
             # report on nr rows
-            print(f'Nr rows pre trimming: {len(X_train)}')
-            print(f'imbalanceness pre trimming: \n {y_train.value_counts()}')
-            logging.info(f'Nr rows pre trimming: {len(X_train)}')
-            logging.info(f'imbalanceness pre trimming: \n {y_train.value_counts()}')
+            logging.info(f"Nr rows pre trimming: {len(X_train)}")
+            logging.info(f"imbalanceness pre trimming: \n {y_train.value_counts()}")
 
-            X_train_trim, y_train_trim = trimPreUpsampleDataRows(X_train, y_train, max_cells, logging)
+            X_train_trim, y_train_trim = trimPreUpsampleDataRows(
+                X_train, y_train, max_cells, logging
+            )
 
             # Nr rows after trimming down dataset
-            print(f'Nr rows pre upsampling: {len(X_train_trim)}')
-            print(f'imbalanceness pre upsampling: \n {y_train_trim.value_counts()}')
-            logging.info(f'Nr rows pre upsampling: {len(X_train_trim)}')
-            logging.info(f'imbalanceness pre upsampling: \n {y_train_trim.value_counts()}')
+            logging.info(f"Nr rows pre upsampling: {len(X_train_trim)}")
+            logging.info(
+                f"imbalanceness pre upsampling: \n {y_train_trim.value_counts()}"
+            )
 
             # upsample by trying SMOTE algo
-            X_train, y_train = upsampleData(X_train_trim, y_train_trim, model_type, logging, random_seed=42)
+            X_train, y_train = upsampleData(
+                X_train_trim, y_train_trim, model_type, logging, random_seed=42
+            )
 
         # Nr rows of training set
-        print(f'Nr rows train set: {len(X_train)}')
-        print(f'Nr rows test set: {len(X_test)}')
-        print(f'imbalanceness train: \n {y_train.value_counts()}')
-        logging.info(f'Nr rows train set: {len(X_train)}')
-        logging.info(f'Nr rows test set: {len(X_test)}')
-        logging.info(f'imbalanceness train: \n {y_train.value_counts()}')
+        logging.info(f"Nr rows train set: {len(X_train)}")
+        logging.info(f"Nr rows test set: {len(X_test)}")
+        logging.info(f"imbalanceness train: \n {y_train.value_counts()}")
 
         # append to the lists
         X_train_list.append(X_train)
@@ -203,60 +242,63 @@ def pre_process_kfold(given_name, data, target_col, feature_cols, model_name, mo
         kfold_nr += 1
 
     # add datasets
-    datasets['cv_train'] = {'X': X_train_list, 'y': y_train_list}
-    datasets['cv_test'] = {'X': X_test_list, 'y': y_test_list}
+    datasets["cv_train"] = {"X": X_train_list, "y": y_train_list}
+    datasets["cv_test"] = {"X": X_test_list, "y": y_test_list}
     ####
 
     return datasets
 
 
 def upsampleData(X, y, model_type, logging, random_seed=42):
-    if model_type == 'classification':
+    if model_type == "classification":
         # oversample train data
         # nested try except (https://stackoverflow.com/questions/17015230/are-nested-try-except-blocks-in-python-a-good-programming-practice)
 
         try:
-            categorical_cols = X.dtypes == 'category'
+            categorical_cols = X.dtypes == "category"
             if categorical_cols.sum() > 0:
-                ros = SMOTENC(categorical_features=categorical_cols, random_state=random_seed)
+                ros = SMOTENC(
+                    categorical_features=categorical_cols, random_state=random_seed
+                )
                 X_ups, y_ups = ros.fit_resample(X, y)
-                print('SMOTE-NC oversampling')
-                logging.info('SMOTE-NC oversampling')
+                logging.info("SMOTE-NC oversampling")
             else:
                 ros = SMOTE(random_state=random_seed)
                 X_ups, y_ups = ros.fit_resample(X, y)
-                print('SMOTE oversampling')
-                logging.info('SMOTE oversampling')
-        except:
+                logging.info("SMOTE oversampling")
+        except Exception:
             ros = RandomOverSampler(random_state=random_seed)
             X_ups, y_ups = ros.fit_resample(X, y)
-            print('Random oversampling')
-            logging.info('Random oversampling')
+            logging.info("Random oversampling")
 
-    elif model_type == 'regression':
+    elif model_type == "regression":
         X_ups, y_ups = X, y
 
     return X_ups, y_ups
 
+
 def trimDownDataRows(X, y, max_cells, logging):
     # Trim dataset if necessary based on amount of cells (columns x rows)
     nr_cells = X.shape[0] * X.shape[1]
     if nr_cells > max_cells:
-        print(f'Dataset shape {X.shape} resulting in {nr_cells} cells \nTrimming down...')
-        logging.info(f'Dataset shape {X.shape} resulting in {nr_cells} cells \nTrimming down...')
+        logging.info(
+            f"Dataset shape {X.shape} resulting in {nr_cells} cells \nTrimming down..."
+        )
         df_pretrim = X.join(y)
         df_posttrim = df_pretrim.sample(n=round(max_cells / X.shape[1]))
         X_trim = df_posttrim[X.columns].reset_index(drop=True)
         y_trim = df_posttrim[y.name].reset_index(drop=True)
         nr_cells_trim = X_trim.shape[0] * X_trim.shape[1]
-        print(f'Trimmed down to {X_trim.shape} resulting in {nr_cells_trim} cells.')
-        logging.info(f'Trimmed down to {X_trim.shape} resulting in {nr_cells_trim} cells.')
+        logging.info(
+            f"Trimmed down to {X_trim.shape} resulting in {nr_cells_trim} cells."
+        )
     else:
         X_trim = X
         y_trim = y
 
     return X_trim, y_trim
 
+
 def trimPreUpsampleDataRows(X, y, max_cells, logging):
     # reset index
     X_ = X.reset_index(drop=True)
@@ -264,20 +306,20 @@ def trimPreUpsampleDataRows(X, y, max_cells, logging):
 
     # Trim dataset if necessary based on amount of cells (columns x rows)
     classes_counts = y_.value_counts()
-    nr_classes = len(classes_counts)
     size_majority_class = classes_counts.max()
 
-    exp_nr_cells = size_majority_class * X_.shape[1] # * nr_classes
-    max_rows = round(max_cells/(X_.shape[1])) # * nr_classes
+    exp_nr_cells = size_majority_class * X_.shape[1]  # * nr_classes
+    max_rows = round(max_cells / (X_.shape[1]))  # * nr_classes
 
     if exp_nr_cells > max_cells:
-        print(f'Expecting {exp_nr_cells} cells, more than set limit of {max_cells}')
-        logging.info(f'Expecting {exp_nr_cells} cells, more than set limit of {max_cells}')
+        logging.info(
+            f"Expecting {exp_nr_cells} cells, more than set limit of {max_cells}"
+        )
         big_classes = classes_counts.index[classes_counts > max_rows]
 
         y_trim = y_[~y_.isin(big_classes)]
         for c in big_classes:
-            y_big = y_[y_==c]
+            y_big = y_[y_ == c]
             y_big_trim = y_big.sample(max_rows)
             y_trim = y_trim.append(y_big_trim)
         y_trim = y_trim.sort_index()
@@ -286,7 +328,6 @@ def trimPreUpsampleDataRows(X, y, max_cells, logging):
         y_trim = y_
         X_trim = X_
 
-    print(f'Original nr of rows {len(X_)} \nNew nr of rows {len(X_trim)}')
-    logging.info(f'Original nr of rows {len(X_)} \nNew nr of rows {len(X_trim)}')
+    logging.info(f"Original nr of rows {len(X_)} \nNew nr of rows {len(X_trim)}")
 
     return X_trim.reset_index(drop=True), y_trim.reset_index(drop=True)


Test patch:
diff --git a/scripts/modeltester.py b/scripts/modeltester.py
index 44c2635..0b3d13b 100644
--- a/scripts/modeltester.py
+++ b/scripts/modeltester.py
@@ -1,33 +1,42 @@
-import os 
-import joblib 
+import joblib
 import pandas as pd
 import logging
-
-from interpret.glassbox import ExplainableBoostingClassifier, ExplainableBoostingRegressor
-from interpret.glassbox import DecisionListClassifier
-from interpret.glassbox import LinearRegression, LogisticRegression
+import numpy as np
 
 from utils.helper_functions.parsing_arguments import GetArgs
-from utils.modelling.performance import *
-from sklearn import tree
+from utils.modelling.performance import (
+    plotClassificationCurve,
+    plotCalibrationCurve,
+    plotProbabilityDistribution,
+    plotYhatVsYSave,
+    plotQuantileError,
+    regressionMetricsTable,
+    plotConfusionMatrix,
+)
 
-def apply_model(args):
 
+def apply_model(args):
     # Set destination
     destination = args.destination_path
 
     # Set Logger
-    logging.basicConfig(format='%(asctime)s %(message)s', filename=destination+'/logging.log', level=logging.DEBUG)
-    logging.getLogger('matplotlib.font_manager').disabled = True # ignore matplotlibs font warnings
+    logging.basicConfig(
+        format="%(asctime)s %(message)s",
+        filename=destination + "/logging.log",
+        level=logging.DEBUG,
+    )
+    logging.getLogger(
+        "matplotlib.font_manager"
+    ).disabled = True  # ignore matplotlibs font warnings
 
     # Load in model
-    model = joblib.load(open(args.model_path, 'rb'))
+    model = joblib.load(open(args.model_path, "rb"))
 
     # Load in data
     df = pd.read_csv(args.data_path)
-    
+
     target_col = model.target
-    feature_cols = [ x for x in model.feature_names if " x " not in x ]
+    feature_cols = [x for x in model.feature_names if " x " not in x]
 
     # Perform inference
     y_true = df[target_col]
@@ -36,40 +45,83 @@ def apply_model(args):
     y_pred = model.predict(X)
 
     # Create performance metrics graphs
-    if hasattr(model, 'classes_'):
-
+    if hasattr(model, "classes_"):
         # If classification make probability prediction
         y_prob = model.predict_proba(X)
 
         if len(model.classes_) == 2:
-
             # for binary only take class one probabilities
-            y_prob = y_prob[:,1]
+            y_prob = y_prob[:, 1]
 
             # Threshold dependant
-            plotConfusionMatrix(destination, y_true, y_prob, y_pred, file_type='html', data_type='test', logging=logging)
+            plotConfusionMatrix(
+                destination,
+                y_true,
+                y_prob,
+                y_pred,
+                file_type="html",
+                data_type="test",
+                logging=logging,
+            )
 
             # Also create pr curve for class 0
             y_neg = np.array([1 - j for j in list(y_true)])
             y_prob_neg = np.array([1 - j for j in list(y_prob)])
 
             # Threshold independant
-            plotClassificationCurve(destination, y_true, y_prob, curve_type='roc', data_type='test', logging=logging)
-
-            plotClassificationCurve(destination, y_true, y_prob, curve_type='pr', data_type='test_class1', logging=logging)
-            plotClassificationCurve(destination, y_neg, y_prob_neg, curve_type='pr', data_type='test_class0', logging=logging)
-
-            plotClassificationCurve(destination, y_true, y_prob, curve_type='pr', data_type='test_data_class1', logging=logging)
-            plotClassificationCurve(destination, y_neg, y_prob_neg, curve_type='pr', data_type='test_data_class0', logging=logging)
-
-            plotCalibrationCurve(destination, y_true, y_prob, data_type='test', logging=logging)
-
-            plotProbabilityDistribution(destination, y_true, y_prob, data_type='test', logging=logging)
-
+            plotClassificationCurve(
+                destination,
+                y_true,
+                y_prob,
+                curve_type="roc",
+                data_type="test",
+                logging=logging,
+            )
+
+            plotClassificationCurve(
+                destination,
+                y_true,
+                y_prob,
+                curve_type="pr",
+                data_type="test_class1",
+                logging=logging,
+            )
+            plotClassificationCurve(
+                destination,
+                y_neg,
+                y_prob_neg,
+                curve_type="pr",
+                data_type="test_class0",
+                logging=logging,
+            )
+
+            plotClassificationCurve(
+                destination,
+                y_true,
+                y_prob,
+                curve_type="pr",
+                data_type="test_data_class1",
+                logging=logging,
+            )
+            plotClassificationCurve(
+                destination,
+                y_neg,
+                y_prob_neg,
+                curve_type="pr",
+                data_type="test_data_class0",
+                logging=logging,
+            )
+
+            plotCalibrationCurve(
+                destination, y_true, y_prob, data_type="test", logging=logging
+            )
+
+            plotProbabilityDistribution(
+                destination, y_true, y_prob, data_type="test", logging=logging
+            )
 
         # If multiclass classification
         elif len(model.classes_) > 2:
-
             # loop through classes
             for c in model.classes_:
                 # creating a list of all the classes except the current class
@@ -79,50 +131,80 @@ def apply_model(args):
                 class_index = list(model.classes_).index(c)
 
                 # marking the current class as 1 and all other classes as 0
-                y_ova = [0 if x in other_class else 1 for x in y]
-                y_prob_ova = [x[class_index] for x in y_prob]  
+                y_ova = [0 if x in other_class else 1 for x in y_true]
+                y_prob_ova = [x[class_index] for x in y_prob]
 
                 # Threshold independant
-                plotClassificationCurve(destination, y_ova, y_prob_ova, curve_type='roc', data_type=f'test_class_{c}', logging=logging)
-
-                plotClassificationCurve(destination, y_ova, y_prob_ova, curve_type='pr', data_type=f'test_class_{c}', logging=logging)
-
-                plotCalibrationCurve(destination, y_ova, y_prob_ova, data_type=f'test_class_{c}', logging=logging)
-
-                plotProbabilityDistribution(destination, y_ova, y_prob_ova, data_type=f'test_class_{c}', logging=logging)
+                plotClassificationCurve(
+                    destination,
+                    y_ova,
+                    y_prob_ova,
+                    curve_type="roc",
+                    data_type=f"test_class_{c}",
+                    logging=logging,
+                )
+
+                plotClassificationCurve(
+                    destination,
+                    y_ova,
+                    y_prob_ova,
+                    curve_type="pr",
+                    data_type=f"test_class_{c}",
+                    logging=logging,
+                )
+
+                plotCalibrationCurve(
+                    destination,
+                    y_ova,
+                    y_prob_ova,
+                    data_type=f"test_class_{c}",
+                    logging=logging,
+                )
+
+                plotProbabilityDistribution(
+                    destination,
+                    y_ova,
+                    y_prob_ova,
+                    data_type=f"test_class_{c}",
+                    logging=logging,
+                )
 
     # if regression
     else:
-        plotYhatVsYSave(destination, y_true, y_pred, data_type='test', logging=logging)
+        plotYhatVsYSave(destination, y_true, y_pred, data_type="test", logging=logging)
 
-        plotQuantileError(destination, y_true, y_pred, data_type='test', logging=logging)
+        plotQuantileError(
+            destination, y_true, y_pred, data_type="test", logging=logging
+        )
 
-        regressionMetricsTable(destination, y_true, y_pred, X, data_type='test', logging=logging)
+        regressionMetricsTable(
+            destination, y_true, y_pred, X, data_type="test", logging=logging
+        )
 
 
-if __name__ == '__main__':
-
-    set_env = 'prod' # either prod or dev
+if __name__ == "__main__":
+    set_env = "prod"  # either prod or dev
 
     # Check if this script is run from terminal
-    if set_env == 'prod':
+    if set_env == "prod":
         # (Prod) script is being run through the terminal
         argvals = None
     else:
         # (Dev) script is not being run through the terminal
 
         # Command line arguments used for testing
-        argvals = '--model_path ../trained_models/20230622_datathon_ebm/model/ebm_regression.sav ' \
-                  '--data_path ../input/data/20230525_cq_datathon.csv ' \
-                  '--destination_path ../trained_models/20230622_datathon_ebm/tested_datasets/20230525_cq_datathon.csv'.split() # example of passing test params to parser
+        argvals = (
+            "--model_path ../trained_models/20230622_datathon_ebm/model/ebm_regression.sav "
+            "--data_path ../input/data/20230525_cq_datathon.csv "
+            "--destination_path ../trained_models/20230622_datathon_ebm/tested_datasets/20230525_cq_datathon.csv".split()
+        )  # example of passing test params to parser
 
         # settings
-        pd.set_option('display.max_rows', 500)
-        pd.set_option('display.max_columns', 10)
-
+        pd.set_option("display.max_rows", 500)
+        pd.set_option("display.max_columns", 10)
 
     # Get arguments from the CLI
-    args = GetArgs('test_model', argvals)
+    args = GetArgs("test_model", argvals)
 
     # Run main with given arguments
-    apply_model(args)
\ No newline at end of file
+    apply_model(args)
diff --git a/scripts/utils/test_helpers/sql_model.py b/scripts/utils/test_helpers/sql_model.py
new file mode 100644
index 0000000..1204f4d
--- /dev/null
+++ b/scripts/utils/test_helpers/sql_model.py
@@ -0,0 +1,19 @@
+import duckdb
+
+
+def execute_sql_script(sql_script, df, output_column):
+    # Replace the <source_table> placeholder with the actual table name
+    sql_script = sql_script.replace("<source_table>", "test_df")
+
+    # Create a DuckDB connection and register the DataFrame
+    conn = duckdb.connect()
+    conn.register("test_df", df)
+
+    # Execute the SQL script
+    results = conn.execute(sql_script).fetchdf()
+
+    # Close the connection
+    conn.close()
+
+    # Return the selected column from the results
+    return results[output_column]
diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/integration/test_dt_sql.py b/tests/integration/test_dt_sql.py
new file mode 100644
index 0000000..2216a0c
--- /dev/null
+++ b/tests/integration/test_dt_sql.py
@@ -0,0 +1,115 @@
+# Make inference using both the pickled model and the SQL model
+# make sure these two models have the same output
+# use example data for this (titanic, although that will only cover the binary classification)
+import sys
+
+sys.path.append("scripts")
+
+import os
+import joblib
+import logging
+import pandas as pd
+import numpy as np
+import pytest
+from utils.test_helpers.sql_model import execute_sql_script
+from utils.output_scripts.decision_tree_as_code import save_model_and_extras
+
+# Assuming your_model.pkl is the pickled model and df is the DataFrame for testing
+SQL_OUTPUT_PATH = "tests/model/tree_in_sql.sql"
+
+# Define a list of models - datasets to test
+clf_binary = [
+    "tests/model/binary_dt_classification.sav",
+    "input/data/example_binary_titanic.csv",
+]
+
+clf_multiclass = [
+    "tests/model/multiclass_dt_classification.sav",
+    "input/data/example_multiclass_faults.csv",
+]
+
+regr_regression = [
+    "tests/model/regression_dt_regression.sav",
+    "input/data/example_regression_used_cars.csv",
+]
+
+# combine into 1 list to iterate over
+fixture_data = [clf_binary, regr_regression]
+
+
+@pytest.fixture(params=fixture_data)
+def load_model_data(request):
+    model_path = request.param[0]
+    print(model_path)
+    model_type = os.path.basename(model_path).split("_")[
+        0
+    ]  # Binary, multiclass or regression
+
+    with open(model_path, "rb") as f:
+        model = joblib.load(f)
+
+    data_path = request.param[1]
+    data_type = os.path.basename(data_path).split("_")[
+        1
+    ]  # Binary, multiclass or regression
+
+    # Load data for testing
+    # Return each element of the list as a fixture value
+    data = pd.read_csv(data_path)
+
+    if model_type == data_type:
+        return data, model, model_type
+
+
+def test_model_processing(
+    load_model_data, sql_split=None, logging=logging.getLogger(__name__)
+):
+    # unpack data and model
+    data, model, model_type = load_model_data
+
+    # Generate SQL from the loaded model
+    save_model_and_extras(
+        clf=model, model_name="tests", sql_split=sql_split, logging=logging
+    )
+
+    # Load the SQL version
+    with open(SQL_OUTPUT_PATH, "r") as sql_file:
+        loaded_sql = sql_file.read()
+
+    # Run SQL against the DataFrame using DuckDB
+
+    if model_type == "multiclass":
+        pred_column = "prediction"
+    elif model_type == "binary":
+        pred_column = "prediction"
+    elif model_type == "regression":
+        pred_column = "prediction"
+
+    sql_pred = execute_sql_script(loaded_sql, data, pred_column)
+
+    # Add assertions to check if the results are as expected
+    assert sql_pred is not None
+
+    # Predict scores using pickled model
+    if model_type == "multiclass":
+        model_pred = model.predict(data[model.feature_names_in_])
+    elif model_type == "binary":
+        model_pred = model.predict(data[model.feature_names_in_])
+    elif model_type == "regression":
+        model_pred = model.predict(data[model.feature_names_in_])
+
+    model_pred = model_pred if model_pred.ndim == 1 else np.sum(model_pred, axis=1)
+    logging.info(
+        f"Max difference SQL - pickled model: {(abs(sql_pred - model_pred)).max()}"
+    )
+    print(sql_pred)
+    print(model_pred)
+    # Check if SQL model prediction is same as pickled model prediction
+    # use a tolerance of
+    tolerance = 0.00001
+    assert (abs(sql_pred - model_pred) <= tolerance).all()
+
+    # Clean up: Optionally, you can delete the generated SQL file after the test
+    import os
+
+    os.remove(SQL_OUTPUT_PATH)
diff --git a/tests/integration/test_ebm_sql.py b/tests/integration/test_ebm_sql.py
new file mode 100644
index 0000000..314b537
--- /dev/null
+++ b/tests/integration/test_ebm_sql.py
@@ -0,0 +1,114 @@
+# Make inference using both the pickled model and the SQL model
+# make sure these two models have the same output
+# use example data for this (titanic, although that will only cover the binary classification)
+import sys
+
+sys.path.append("scripts")
+
+import os
+import joblib
+import logging
+import pandas as pd
+import numpy as np
+import pytest
+from utils.test_helpers.sql_model import execute_sql_script
+from utils.output_scripts.ebm_as_code import save_model_and_extras
+
+# Assuming your_model.pkl is the pickled model and df is the DataFrame for testing
+SQL_OUTPUT_PATH = "tests/model/ebm_in_sql.sql"
+
+# Define a list of models - datasets to test
+clf_binary = [
+    "tests/model/binary_ebm_classification.sav",
+    "input/data/example_binary_titanic.csv",
+]
+
+clf_multiclass = [
+    "tests/model/multiclass_ebm_classification.sav",
+    "input/data/example_multiclass_faults.csv",
+]
+
+regr_regression = [
+    "tests/model/regression_ebm_regression.sav",
+    "input/data/example_regression_used_cars.csv",
+]
+
+# combine into 1 list to iterate over
+fixture_data = [clf_binary, clf_multiclass, regr_regression]
+
+
+@pytest.fixture(params=fixture_data)
+def load_model_data(request):
+    model_path = request.param[0]
+    model_type = os.path.basename(model_path).split("_")[
+        0
+    ]  # Binary, multiclass or regression
+
+    with open(model_path, "rb") as f:
+        model = joblib.load(f)
+
+    data_path = request.param[1]
+    data_type = os.path.basename(data_path).split("_")[
+        1
+    ]  # Binary, multiclass or regression
+
+    # Load data for testing
+    # Return each element of the list as a fixture value
+    data = pd.read_csv(data_path)
+
+    if model_type == data_type:
+        return data, model, model_type
+
+
+# Define a fixture for split parameter
+@pytest.fixture(params=[True, False])
+def split(request):
+    return request.param
+
+
+def test_model_processing(load_model_data, split, logging=logging.getLogger(__name__)):
+    # unpack data and model
+    data, model, model_type = load_model_data
+
+    # Generate SQL from the loaded model
+    save_model_and_extras(ebm=model, model_name="tests", split=split, logging=logging)
+
+    # Load the SQL version
+    with open(SQL_OUTPUT_PATH, "r") as sql_file:
+        loaded_sql = sql_file.read()
+
+    # Run SQL against the DataFrame using DuckDB
+
+    if model_type == "multiclass":
+        prob_column = "probability_Z_Scratch"
+    elif model_type == "binary":
+        prob_column = "probability"
+    elif model_type == "regression":
+        prob_column = "prediction"
+
+    sql_pred = execute_sql_script(loaded_sql, data, prob_column)
+
+    # Add assertions to check if the results are as expected
+    assert sql_pred is not None
+
+    # Predict scores using pickled model
+    if model_type == "multiclass":
+        model_pred = model.predict_proba(data)[:,-1]
+    elif model_type == "binary":
+        model_pred = model.predict_proba(data)[:,1]
+    elif model_type == "regression":
+        model_pred = model.predict(data)
+
+    logging.info(
+        f"Max difference SQL - pickled model: {(abs((sql_pred - model_pred)/model_pred)).max()}"
+    )
+
+    # Check if SQL model prediction is same as pickled model prediction
+    # use a tolerance of 0.001%
+    tolerance = 0.00001
+    assert (abs((sql_pred - model_pred) / model_pred) <= tolerance).all()
+
+    # Clean up: Delete the generated SQL file after the test
+    import os
+
+    os.remove(SQL_OUTPUT_PATH)
diff --git a/tests/integration/test_lr_sql.py b/tests/integration/test_lr_sql.py
new file mode 100644
index 0000000..871595e
--- /dev/null
+++ b/tests/integration/test_lr_sql.py
@@ -0,0 +1,115 @@
+# Make inference using both the pickled model and the SQL model
+# make sure these two models have the same output
+# use example data for this (titanic, although that will only cover the binary classification)
+import sys
+
+sys.path.append("scripts")
+
+import os
+import joblib
+import logging
+import pandas as pd
+import pytest
+from utils.test_helpers.sql_model import execute_sql_script
+from utils.output_scripts.l_regression_as_code import save_model_and_extras
+
+# Assuming your_model.pkl is the pickled model and df is the DataFrame for testing
+SQL_OUTPUT_PATH = "tests/model/lregression_in_sql.sql"
+
+# Define a list of models - datasets to test
+clf_binary = [
+    "tests/model/binary_lr_classification.sav",
+    "input/data/example_binary_titanic.csv",
+]
+
+clf_multiclass = [
+    "tests/model/multiclass_lr_classification.sav",
+    "input/data/example_multiclass_faults.csv",
+]
+
+regr_regression = [
+    "tests/model/regression_lr_regression.sav",
+    "input/data/example_regression_used_cars.csv",
+]
+
+# combine into 1 list to iterate over
+fixture_data = [clf_binary, clf_multiclass, regr_regression]
+
+
+@pytest.fixture(params=fixture_data)
+def load_model_data(request):
+    model_path = request.param[0]
+    print(model_path)
+    model_type = os.path.basename(model_path).split("_")[
+        0
+    ]  # Binary, multiclass or regression
+
+    with open(model_path, "rb") as f:
+        model = joblib.load(f)
+
+    data_path = request.param[1]
+    data_type = os.path.basename(data_path).split("_")[
+        1
+    ]  # Binary, multiclass or regression
+
+    # Load data for testing
+    # Return each element of the list as a fixture value
+    data = pd.read_csv(data_path)
+
+    if model_type == data_type:
+        return data, model, model_type
+
+
+# Define a fixture for split parameter
+@pytest.fixture(params=[True, False])
+def split(request):
+    return request.param
+
+
+def test_model_processing(load_model_data, split, logging=logging.getLogger(__name__)):
+    # unpack data and model
+    data, model, model_type = load_model_data
+
+    # Generate SQL from the loaded model
+    save_model_and_extras(
+        clf=model, model_name="tests", sql_split=split, logging=logging
+    )
+
+    # Load the SQL version
+    with open(SQL_OUTPUT_PATH, "r") as sql_file:
+        loaded_sql = sql_file.read()
+
+    # Run SQL against the DataFrame using DuckDB
+    if model_type == "multiclass":
+        pred_column = "probability_Z_Scratch"
+    elif model_type == "binary":
+        pred_column = "probability"
+    elif model_type == "regression":
+        pred_column = "prediction"
+
+    sql_pred = execute_sql_script(loaded_sql, data, pred_column)
+
+    # Add assertions to check if the results are as expected
+    assert sql_pred is not None
+
+    # Predict scores using pickled model
+    if model_type == "multiclass":
+        model_pred = model.predict_proba(data[model.feature_names_in_])[:,-1]
+    elif model_type == "binary":
+        model_pred = model.predict_proba(data[model.feature_names_in_])[:, 1]
+    elif model_type == "regression":
+        model_pred = model.predict(data[model.feature_names_in_])
+
+    logging.info(
+        f"Max difference SQL - pickled model: {(abs((sql_pred - model_pred)/model_pred)).max()}"
+    )
+
+    # Check if SQL model prediction is same as pickled model prediction
+    # use a tolerance of 0.001%
+    tolerance = 0.00001
+    assert (abs((sql_pred - model_pred) / model_pred) <= tolerance).all()
+
+    # Clean up: Optionally, you can delete the generated SQL file after the test
+    import os
+
+    os.remove(SQL_OUTPUT_PATH)
diff --git a/tests/integration/test_main.py b/tests/integration/test_main.py
new file mode 100644
index 0000000..247814b
--- /dev/null
+++ b/tests/integration/test_main.py
@@ -0,0 +1,26 @@
+import sys
+
+sys.path.append("scripts")
+
+import os
+import shutil
+import subprocess
+
+def test_cli_exit_code():
+    OUTPUT_PATH = 'trained_models/test_tool'
+
+    # Make directory with current data and model name
+    try:
+        os.makedirs(f"{OUTPUT_PATH}")
+        os.makedirs(f"{OUTPUT_PATH}/feature_importance")
+        os.makedirs(f"{OUTPUT_PATH}/feature_info")
+        os.makedirs(f"{OUTPUT_PATH}/performance")
+        os.makedirs(f"{OUTPUT_PATH}/model")
+    except FileExistsError:
+        sys.exit("Error: Model directory already exists")
+
+    result = subprocess.run(['.ml2sql/bin/python', 'scripts/main.py', '--name', OUTPUT_PATH, '--data_path', 'input/data/example_binary_titanic.csv', '--configuration', 'input/configuration/example_binary_titanic.json', '--model', 'ebm'], stdout=subprocess.PIPE, text=True, check=False)
+    assert result.returncode == 0
+
+    # Remove the folder and its contents
+    shutil.rmtree(OUTPUT_PATH)
\ No newline at end of file
diff --git a/tests/model/binary_dt_classification.sav b/tests/model/binary_dt_classification.sav
new file mode 100644
index 0000000..006761f
Binary files /dev/null and b/tests/model/binary_dt_classification.sav differ
diff --git a/tests/model/binary_ebm_classification.sav b/tests/model/binary_ebm_classification.sav
new file mode 100644
index 0000000..100a00a
Binary files /dev/null and b/tests/model/binary_ebm_classification.sav differ
diff --git a/tests/model/binary_lr_classification.sav b/tests/model/binary_lr_classification.sav
new file mode 100644
index 0000000..56f8803
Binary files /dev/null and b/tests/model/binary_lr_classification.sav differ
diff --git a/tests/model/multiclass_dt_classification.sav b/tests/model/multiclass_dt_classification.sav
new file mode 100644
index 0000000..1732c81
Binary files /dev/null and b/tests/model/multiclass_dt_classification.sav differ
diff --git a/tests/model/multiclass_ebm_classification.sav b/tests/model/multiclass_ebm_classification.sav
new file mode 100644
index 0000000..4fd0e92
Binary files /dev/null and b/tests/model/multiclass_ebm_classification.sav differ
diff --git a/tests/model/multiclass_lr_classification.sav b/tests/model/multiclass_lr_classification.sav
new file mode 100644
index 0000000..6c9a072
Binary files /dev/null and b/tests/model/multiclass_lr_classification.sav differ
diff --git a/tests/model/regression_dt_regression.sav b/tests/model/regression_dt_regression.sav
new file mode 100644
index 0000000..01fb742
Binary files /dev/null and b/tests/model/regression_dt_regression.sav differ
diff --git a/tests/model/regression_ebm_regression.sav b/tests/model/regression_ebm_regression.sav
new file mode 100644
index 0000000..8ab79b1
Binary files /dev/null and b/tests/model/regression_ebm_regression.sav differ
diff --git a/tests/model/regression_lr_regression.sav b/tests/model/regression_lr_regression.sav
new file mode 100644
index 0000000..3239ef5
Binary files /dev/null and b/tests/model/regression_lr_regression.sav differ
diff --git a/tests/pytest.ini b/tests/pytest.ini
new file mode 100644
index 0000000..1eb9786
--- /dev/null
+++ b/tests/pytest.ini
@@ -0,0 +1,6 @@
+[pytest]  
+log_cli=true  
+log_level=DEBUG  
+log_format = %(asctime)s %(levelname)s %(message)s  
+log_date_format = %Y-%m-%d %H:%M:%S
+pythonpath = scripts
\ No newline at end of file
diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py
new file mode 100644
index 0000000..e69de29