From 920219caef4be78d1a440fbe7bf7c8b76d8d3ba8 Mon Sep 17 00:00:00 2001 From: xzdandy Date: Wed, 4 Oct 2023 02:48:28 -0400 Subject: [PATCH 01/64] Remove empty evadb.db file. --- evadb.db | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 evadb.db diff --git a/evadb.db b/evadb.db deleted file mode 100644 index e69de29bb2..0000000000 From 2b5ba6a5cfc0b1465289f6d7b2206fa667d0b552 Mon Sep 17 00:00:00 2001 From: xzdandy Date: Wed, 4 Oct 2023 02:49:40 -0400 Subject: [PATCH 02/64] Move github test into long intergration test so they are run on the circle ci. --- .../long}/test_github_datasource.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{third_party_tests => integration_tests/long}/test_github_datasource.py (100%) diff --git a/test/third_party_tests/test_github_datasource.py b/test/integration_tests/long/test_github_datasource.py similarity index 100% rename from test/third_party_tests/test_github_datasource.py rename to test/integration_tests/long/test_github_datasource.py From 45af91efb6d74c068eb4436f4ec0cdc98a588ab9 Mon Sep 17 00:00:00 2001 From: xzdandy Date: Wed, 4 Oct 2023 03:03:31 -0400 Subject: [PATCH 03/64] Clean up test_relational_api.py --- .../long/interfaces/relational/test_relational_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/integration_tests/long/interfaces/relational/test_relational_api.py b/test/integration_tests/long/interfaces/relational/test_relational_api.py index 773607960b..fee4029e2a 100644 --- a/test/integration_tests/long/interfaces/relational/test_relational_api.py +++ b/test/integration_tests/long/interfaces/relational/test_relational_api.py @@ -57,6 +57,7 @@ def tearDown(self): # todo: move these to relational apis as well execute_query_fetch_all(self.evadb, """DROP TABLE IF EXISTS mnist_video;""") execute_query_fetch_all(self.evadb, """DROP TABLE IF EXISTS meme_images;""") + execute_query_fetch_all(self.evadb, """DROP TABLE IF EXISTS dummy_table;""") def test_relation_apis(self): cursor = self.conn.cursor() From 9d2227e452e978464c6f05887f1f65446b3909f6 Mon Sep 17 00:00:00 2001 From: xzdandy Date: Wed, 4 Oct 2023 03:06:35 -0400 Subject: [PATCH 04/64] Update link in the github data source documentation --- docs/source/reference/databases/github.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/reference/databases/github.rst b/docs/source/reference/databases/github.rst index 6674e6575f..fcbd5f62e3 100644 --- a/docs/source/reference/databases/github.rst +++ b/docs/source/reference/databases/github.rst @@ -34,7 +34,7 @@ Create Connection Supported Tables ---------------- -* ``stargazers``: Lists the people that have starred the repository. Check `evadb/third_party/databases/github/table_column_info.py` for all the available columns in the table. +* ``stargazers``: Lists the people that have starred the repository. Check `table_column_info.py`_ for all the available columns in the table. .. code-block:: sql @@ -54,4 +54,4 @@ Here is the query output: .. note:: - Looking for another table from Github? You can add a table mapping in `evadb/third_party/databases/github/github_handler.py`, or simply raise a `Feature Request `_. + Looking for another table from Github? You can add a table mapping in `github_handler.py`_, or simply raise a `Feature Request `_. From c322adaa0b645f208c2bc80aa613fb12d31e2c8a Mon Sep 17 00:00:00 2001 From: xzdandy Date: Wed, 4 Oct 2023 03:09:15 -0400 Subject: [PATCH 05/64] Fix doc links --- docs/source/reference/databases/github.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/reference/databases/github.rst b/docs/source/reference/databases/github.rst index fcbd5f62e3..00e706d49a 100644 --- a/docs/source/reference/databases/github.rst +++ b/docs/source/reference/databases/github.rst @@ -34,7 +34,7 @@ Create Connection Supported Tables ---------------- -* ``stargazers``: Lists the people that have starred the repository. Check `table_column_info.py`_ for all the available columns in the table. +* ``stargazers``: Lists the people that have starred the repository. Check `table_column_info.py `_ for all the available columns in the table. .. code-block:: sql @@ -54,4 +54,4 @@ Here is the query output: .. note:: - Looking for another table from Github? You can add a table mapping in `github_handler.py`_, or simply raise a `Feature Request `_. + Looking for another table from Github? You can add a table mapping in `github_handler.py `_, or simply raise a `Feature Request `_. From 89e48889186d919fdade64961d1a8277bdc9e946 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:18:37 -0700 Subject: [PATCH 06/64] Bump Version to v0.3.9+dev (#1304) Bump Version to v0.3.9+dev --------- Co-authored-by: Jiashen Cao Co-authored-by: Gaurav Tarlok Kakkar --- CHANGELOG.md | 31 +++++++++++++++++++ README.md | 2 +- .../reference/ai/custom-ai-function.rst | 2 +- evadb/version.py | 2 +- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5557e9fadc..f8ef0b95de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### [Deprecated] ### [Removed] +## [0.3.8] - 2023-10-18 + +* PR #1303: v0.3.8 - new release +* PR #1302: Reenable batch for release +* PR #1301: Add Documentation for UDF Unit Testing and Mocking +* PR #1232: Starting the change for XGBoost integration into EVADb. +* PR #1294: fix: improve testcase +* PR #1293: fix: make the table/function catalog insert operation atomic +* PR #1295: feat: add support for show databases +* PR #1296: feat: function_metadata supports boolean and float +* PR #1290: fix: text_summarization uses drop udf +* PR #1240: Add stable diffusion integration +* PR #1285: Update custom-ai-function.rst +* PR #1234: Added basic functionalities of REST apis +* PR #1281: Clickhouse integration +* PR #1273: Update custom-ai-function.rst +* PR #1274: Fix Notebook and Ray testcases at staging +* PR #1264: SHOW command for retrieveing configurations +* PR #1270: fix: Catalog init introduces significant overhead +* PR #1267: Improve the error message when there is a typo in the column name in the query. +* PR #1261: Remove dimensions from `TEXT` and `FLOAT` +* PR #1256: Remove table names from column names for `df +* PR #1253: Collection of fixes for the staging branch +* PR #1246: feat: insertion update index +* PR #1245: Documentation on vector stores + vector benchmark +* PR #1244: feat: create index from projection +* PR #1233: GitHub Data Source Integration +* PR #1115: Add support for Neuralforecast +* PR #1241: Bump Version to v0.3.8+dev +* PR #1239: release 0.3.7 + ## [0.3.7] - 2023-09-30 * PR #1239: release 0.3.7 diff --git a/README.md b/README.md index 05fd08772e..92b3a5e681 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Our target audience is software developers who may not necessarily have a backgr
    -
  • Connect EvaDB to your SQL and vector database systems with the `CREATE DATABASE` and `CREATE INDEX` statements.
  • +
  • Connect EvaDB to your SQL and vector database systems with the `CREATE DATABASE` and `CREATE INDEX` statements.
  • Write SQL queries with AI functions to get inference results:
    • Pick a pre-trained AI model from Hugging Face, Open AI, Ultralytics, PyTorch, and built-in AI frameworks for generative AI, NLP, and vision applications;
    • diff --git a/docs/source/reference/ai/custom-ai-function.rst b/docs/source/reference/ai/custom-ai-function.rst index 71c19bb91c..68e1d64616 100644 --- a/docs/source/reference/ai/custom-ai-function.rst +++ b/docs/source/reference/ai/custom-ai-function.rst @@ -44,7 +44,7 @@ The abstract method `setup` must be implemented in your function. The setup func Any additional arguments needed for creating the function must be passed as arguments to the setup function. (Please refer to the `ChatGPT `__ function example). -The additional arguments are passed with the CREATE command. Please refer to `CREATE `_ command documentation. +The additional arguments are passed with the CREATE command. Please refer to `CREATE `_ command documentation. The custom setup operations for the function can be written inside the function in the child class. If there is no need for any custom logic, then you can just simply write "pass" in the function definition. diff --git a/evadb/version.py b/evadb/version.py index e583161907..c6ac2fe6fb 100644 --- a/evadb/version.py +++ b/evadb/version.py @@ -1,6 +1,6 @@ _MAJOR = "0" _MINOR = "3" -_REVISION = "8" +_REVISION = "9+dev" VERSION_SHORT = f"{_MAJOR}.{_MINOR}" VERSION = f"{_MAJOR}.{_MINOR}.{_REVISION}" From e19f13da3624bc8bb19292b121a12fa8c5ea6b36 Mon Sep 17 00:00:00 2001 From: Sayan Sinha Date: Thu, 19 Oct 2023 09:54:42 -0400 Subject: [PATCH 07/64] Fix current issues with forecasting (#1283) This PR aims to solve the following issues: - [x] Throwing error when non-numeric characters are in the data (partially fixes #1243) - [x] Math domain error with `statsforecast`. - [x] Fix GPU support for `neuralforecast`. - ~Neuralforecast support for directly using batched data.~ - ~Auto frequency determination ( #1279).~ Will create separate PRs for the last two points. --------- Co-authored-by: Andy Xu --- evadb/executor/create_function_executor.py | 76 +++++++++++++++++++--- evadb/functions/forecast.py | 15 +++-- 2 files changed, 77 insertions(+), 14 deletions(-) diff --git a/evadb/executor/create_function_executor.py b/evadb/executor/create_function_executor.py index 3791575634..367110b1d8 100644 --- a/evadb/executor/create_function_executor.py +++ b/evadb/executor/create_function_executor.py @@ -12,9 +12,12 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import contextlib import hashlib +import locale import os import pickle +import re from pathlib import Path from typing import Dict, List @@ -50,6 +53,31 @@ from evadb.utils.logging_manager import logger +# From https://stackoverflow.com/a/34333710 +@contextlib.contextmanager +def set_env(**environ): + """ + Temporarily set the process environment variables. + + >>> with set_env(PLUGINS_DIR='test/plugins'): + ... "PLUGINS_DIR" in os.environ + True + + >>> "PLUGINS_DIR" in os.environ + False + + :type environ: dict[str, unicode] + :param environ: Environment variables to set + """ + old_environ = dict(os.environ) + os.environ.update(environ) + try: + yield + finally: + os.environ.clear() + os.environ.update(old_environ) + + class CreateFunctionExecutor(AbstractExecutor): def __init__(self, db: EvaDBDatabase, node: CreateFunctionPlan): super().__init__(db, node) @@ -169,6 +197,15 @@ def handle_sklearn_function(self): self.node.metadata, ) + def convert_to_numeric(self, x): + x = re.sub("[^0-9.,]", "", str(x)) + locale.setlocale(locale.LC_ALL, "") + x = float(locale.atof(x)) + if x.is_integer(): + return int(x) + else: + return x + def handle_xgboost_function(self): """Handle xgboost functions @@ -245,7 +282,6 @@ def handle_ultralytics_function(self): def handle_forecasting_function(self): """Handle forecasting functions""" - os.environ["CUDA_VISIBLE_DEVICES"] = "" aggregated_batch_list = [] child = self.children[0] for batch in child.exec(): @@ -369,7 +405,7 @@ def handle_forecasting_function(self): model_args["input_size"] = 2 * horizon model_args["early_stop_patience_steps"] = 20 else: - model_args["config"] = { + model_args_config = { "input_size": 2 * horizon, "early_stop_patience_steps": 20, } @@ -381,7 +417,13 @@ def handle_forecasting_function(self): if "auto" not in arg_map["model"].lower(): model_args["hist_exog_list"] = exogenous_columns else: - model_args["config"]["hist_exog_list"] = exogenous_columns + model_args_config["hist_exog_list"] = exogenous_columns + + def get_optuna_config(trial): + return model_args_config + + model_args["config"] = get_optuna_config + model_args["backend"] = "optuna" model_args["h"] = horizon @@ -455,13 +497,31 @@ def handle_forecasting_function(self): ] if len(existing_model_files) == 0: logger.info("Training, please wait...") + for column in data.columns: + if column != "ds" and column != "unique_id": + data[column] = data.apply( + lambda x: self.convert_to_numeric(x[column]), axis=1 + ) if library == "neuralforecast": - model.fit(df=data, val_size=horizon) + cuda_devices_here = "0" + if "CUDA_VISIBLE_DEVICES" in os.environ: + cuda_devices_here = os.environ["CUDA_VISIBLE_DEVICES"].split(",")[0] + + with set_env(CUDA_VISIBLE_DEVICES=cuda_devices_here): + model.fit(df=data, val_size=horizon) + model.save(model_path, overwrite=True) else: + # The following lines of code helps eliminate the math error encountered in statsforecast when only one datapoint is available in a time series + for col in data["unique_id"].unique(): + if len(data[data["unique_id"] == col]) == 1: + data = data._append( + [data[data["unique_id"] == col]], ignore_index=True + ) + model.fit(df=data[["ds", "y", "unique_id"]]) - f = open(model_path, "wb") - pickle.dump(model, f) - f.close() + f = open(model_path, "wb") + pickle.dump(model, f) + f.close() elif not Path(model_path).exists(): model_path = os.path.join(model_dir, existing_model_files[-1]) @@ -483,8 +543,6 @@ def handle_forecasting_function(self): FunctionMetadataCatalogEntry("library", library), ] - os.environ.pop("CUDA_VISIBLE_DEVICES", None) - return ( self.node.name, impl_path, diff --git a/evadb/functions/forecast.py b/evadb/functions/forecast.py index 1571f6c4fc..46376852d2 100644 --- a/evadb/functions/forecast.py +++ b/evadb/functions/forecast.py @@ -38,16 +38,21 @@ def setup( horizon: int, library: str, ): - f = open(model_path, "rb") - loaded_model = pickle.load(f) - f.close() + self.library = library + if "neuralforecast" in self.library: + from neuralforecast import NeuralForecast + + loaded_model = NeuralForecast.load(path=model_path) + self.model_name = model_name[4:] if "Auto" in model_name else model_name + else: + with open(model_path, "rb") as f: + loaded_model = pickle.load(f) + self.model_name = model_name self.model = loaded_model - self.model_name = model_name self.predict_column_rename = predict_column_rename self.time_column_rename = time_column_rename self.id_column_rename = id_column_rename self.horizon = int(horizon) - self.library = library def forward(self, data) -> pd.DataFrame: if self.library == "statsforecast": From 4640d8fc6579ad2f5f8425814a23c1850d3bb8b4 Mon Sep 17 00:00:00 2001 From: Gaurav Tarlok Kakkar Date: Thu, 19 Oct 2023 14:03:51 -0400 Subject: [PATCH 08/64] Configuration Manager Redesign (#1272) 1. Removed `config.yml` file. Users can directly use `SET` command. 2. Moved `OPENAI_KEY` to `OPENAI_API_KEY` --------- Co-authored-by: hershd23 Co-authored-by: Andy Xu --- .circleci/config.yml | 2 +- apps/pandas_qa/pandas_qa.py | 4 +- apps/youtube_qa/youtube_qa.py | 4 +- docs/source/overview/concepts.rst | 2 +- .../reference/ai/custom-ai-function.rst | 3 - docs/source/usecases/question-answering.rst | 2 +- evadb/binder/statement_binder.py | 21 ++++- evadb/catalog/catalog_manager.py | 67 ++++++++++----- evadb/catalog/catalog_utils.py | 26 +++--- evadb/catalog/models/base_model.py | 36 -------- evadb/catalog/models/configuration_catalog.py | 43 ++++++++++ evadb/catalog/models/utils.py | 24 +++++- .../services/configuration_catalog_service.py | 76 +++++++++++++++++ .../services/function_cost_catalog_service.py | 2 +- evadb/catalog/sql_config.py | 34 ++------ evadb/configuration/bootstrap_environment.py | 82 ++++++------------- evadb/configuration/configuration_manager.py | 71 ---------------- evadb/configuration/constants.py | 2 +- evadb/database.py | 33 ++++---- evadb/evadb.yml | 30 ------- evadb/evadb_cmd_client.py | 10 +-- evadb/evadb_config.py | 39 +++++++++ evadb/executor/abstract_executor.py | 6 -- evadb/executor/create_function_executor.py | 12 ++- evadb/executor/create_index_executor.py | 6 +- evadb/executor/drop_object_executor.py | 4 +- evadb/executor/execution_context.py | 14 +--- evadb/executor/executor_utils.py | 10 ++- evadb/executor/load_multimedia_executor.py | 4 +- evadb/executor/set_executor.py | 6 +- evadb/executor/show_info_executor.py | 3 +- evadb/executor/vector_index_scan_executor.py | 4 +- .../abstract/pytorch_abstract_function.py | 4 +- evadb/functions/chatgpt.py | 11 ++- evadb/functions/dalle.py | 14 ++-- evadb/functions/stable_diffusion.py | 14 +--- evadb/optimizer/optimizer_context.py | 4 +- evadb/optimizer/plan_generator.py | 4 +- evadb/optimizer/rules/rules.py | 9 +- evadb/optimizer/rules/rules_manager.py | 7 +- evadb/parser/evadb.lark | 2 +- evadb/server/server.py | 2 +- evadb/third_party/vector_stores/pinecone.py | 15 ++-- evadb/third_party/vector_stores/utils.py | 1 + test/app_tests/test_pandas_qa.py | 4 +- test/app_tests/test_privategpt.py | 4 +- test/app_tests/test_youtube_channel_qa.py | 6 +- test/app_tests/test_youtube_qa.py | 6 +- .../long/test_create_index_executor.py | 2 +- .../long/test_error_handling_with_ray.py | 4 +- .../long/test_explain_executor.py | 4 +- .../long/test_load_executor.py | 4 +- .../long/test_optimizer_rules.py | 17 +--- test/integration_tests/long/test_pytorch.py | 8 +- test/integration_tests/long/test_reuse.py | 2 +- .../long/test_s3_load_executor.py | 4 +- .../integration_tests/long/test_similarity.py | 2 +- .../short/test_set_executor.py | 4 +- .../catalog/test_catalog_manager.py | 26 +++--- .../executor/test_execution_context.py | 34 ++------ .../optimizer/rules/test_batch_mem_size.py | 4 +- test/unit_tests/optimizer/rules/test_rules.py | 19 ++--- .../optimizer/test_optimizer_task.py | 10 +-- test/unit_tests/test_dalle.py | 2 +- test/unit_tests/test_eva_cmd_client.py | 28 +++---- test/util.py | 16 ++-- 66 files changed, 492 insertions(+), 487 deletions(-) create mode 100644 evadb/catalog/models/configuration_catalog.py create mode 100644 evadb/catalog/services/configuration_catalog_service.py delete mode 100644 evadb/configuration/configuration_manager.py delete mode 100644 evadb/evadb.yml create mode 100644 evadb/evadb_config.py diff --git a/.circleci/config.yml b/.circleci/config.yml index 01984e154b..cb7ad985d9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -234,7 +234,7 @@ jobs: else pip install ".[dev,pinecone,chromadb]" # ray < 2.5.0 does not work with python 3.11 ray-project/ray#33864 fi - python -c "import yaml;f = open('evadb/evadb.yml', 'r+');config_obj = yaml.load(f, Loader=yaml.FullLoader);config_obj['experimental']['ray'] = True;f.seek(0);f.write(yaml.dump(config_obj));f.truncate();" + python -c "import evadb;cur=evadb.connect().cursor();cur.query('SET ray=True';)" else if [ $PY_VERSION != "3.11" ]; then pip install ".[dev,ludwig,qdrant,pinecone,chromadb]" diff --git a/apps/pandas_qa/pandas_qa.py b/apps/pandas_qa/pandas_qa.py index 8e4b6868a0..b81ce27d11 100644 --- a/apps/pandas_qa/pandas_qa.py +++ b/apps/pandas_qa/pandas_qa.py @@ -53,10 +53,10 @@ def receive_user_input() -> Dict: # get OpenAI key if needed try: - api_key = os.environ["OPENAI_KEY"] + api_key = os.environ["OPENAI_API_KEY"] except KeyError: api_key = str(input("🔑 Enter your OpenAI key: ")) - os.environ["OPENAI_KEY"] = api_key + os.environ["OPENAI_API_KEY"] = api_key return user_input diff --git a/apps/youtube_qa/youtube_qa.py b/apps/youtube_qa/youtube_qa.py index 5a56bbe29d..ee4626473c 100644 --- a/apps/youtube_qa/youtube_qa.py +++ b/apps/youtube_qa/youtube_qa.py @@ -93,10 +93,10 @@ def receive_user_input() -> Dict: # get OpenAI key if needed try: - api_key = os.environ["OPENAI_KEY"] + api_key = os.environ["OPENAI_API_KEY"] except KeyError: api_key = str(input("🔑 Enter your OpenAI key: ")) - os.environ["OPENAI_KEY"] = api_key + os.environ["OPENAI_API_KEY"] = api_key return user_input diff --git a/docs/source/overview/concepts.rst b/docs/source/overview/concepts.rst index c9dba32159..f2905b640f 100644 --- a/docs/source/overview/concepts.rst +++ b/docs/source/overview/concepts.rst @@ -46,7 +46,7 @@ Here are some illustrative **AI queries** for a ChatGPT-based video question ans --- The 'transcripts' table has a column called 'text' with the transcript text --- Since ChatGPT is a built-in function in EvaDB, we don't have to define it --- We can directly use ChatGPT() in any query - --- We will only need to set the OPENAI_KEY as an environment variable + --- We will only need to set the OPENAI_API_KEY as an environment variable SELECT ChatGPT('Is this video summary related to Ukraine russia war', text) FROM TEXT_SUMMARY; diff --git a/docs/source/reference/ai/custom-ai-function.rst b/docs/source/reference/ai/custom-ai-function.rst index 68e1d64616..3db8457be4 100644 --- a/docs/source/reference/ai/custom-ai-function.rst +++ b/docs/source/reference/ai/custom-ai-function.rst @@ -258,9 +258,6 @@ The following code can be used to create an Object Detection function using Yolo try_to_import_openai() import openai - #setting up the key - openai.api_key = ConfigurationManager().get_value("third_party", "OPENAI_KEY") - #getting the data content = text_df[text_df.columns[0]] responses = [] diff --git a/docs/source/usecases/question-answering.rst b/docs/source/usecases/question-answering.rst index 7a1235da04..15f548d9cb 100644 --- a/docs/source/usecases/question-answering.rst +++ b/docs/source/usecases/question-answering.rst @@ -57,7 +57,7 @@ EvaDB has built-in support for ``ChatGPT`` function from ``OpenAI``. You will ne # Set OpenAI key import os - os.environ["OPENAI_KEY"] = "sk-..." + os.environ["OPENAI_API_KEY"] = "sk-..." .. note:: diff --git a/evadb/binder/statement_binder.py b/evadb/binder/statement_binder.py index f1e949941c..128e6e7eed 100644 --- a/evadb/binder/statement_binder.py +++ b/evadb/binder/statement_binder.py @@ -34,6 +34,7 @@ from evadb.catalog.catalog_utils import get_metadata_properties, is_document_table from evadb.catalog.sql_config import RESTRICTED_COL_NAMES from evadb.configuration.constants import EvaDB_INSTALLATION_DIR +from evadb.executor.execution_context import Context from evadb.expression.abstract_expression import AbstractExpression, ExpressionType from evadb.expression.function_expression import FunctionExpression from evadb.expression.tuple_value_expression import TupleValueExpression @@ -273,6 +274,11 @@ def _bind_tuple_expr(self, node: TupleValueExpression): @bind.register(FunctionExpression) def _bind_func_expr(self, node: FunctionExpression): + # setup the context + # we read the GPUs from the catalog and populate in the context + gpus_ids = self._catalog().get_configuration_catalog_value("gpu_ids") + node._context = Context(gpus_ids) + # handle the special case of "extract_object" if node.name.upper() == str(FunctionType.EXTRACT_OBJECT): handle_bind_extract_object_function(node, self) @@ -340,9 +346,18 @@ def _bind_func_expr(self, node: FunctionExpression): ) # certain functions take additional inputs like yolo needs the model_name # these arguments are passed by the user as part of metadata - node.function = lambda: function_class( - **get_metadata_properties(function_obj) - ) + # we also handle the special case of ChatGPT where we need to send the + # OpenAPI key as part of the parameter if not provided by the user + properties = get_metadata_properties(function_obj) + if string_comparison_case_insensitive(node.name, "CHATGPT"): + # if the user didn't provide any API_KEY, check if we have one in the catalog + if "OPENAI_API_KEY" not in properties.keys(): + openapi_key = self._catalog().get_configuration_catalog_value( + "OPENAI_API_KEY" + ) + properties["openai_api_key"] = openapi_key + + node.function = lambda: function_class(**properties) except Exception as e: err_msg = ( f"{str(e)}. Please verify that the function class name in the " diff --git a/evadb/catalog/catalog_manager.py b/evadb/catalog/catalog_manager.py index 7f63be108b..20c50c9dfb 100644 --- a/evadb/catalog/catalog_manager.py +++ b/evadb/catalog/catalog_manager.py @@ -14,7 +14,7 @@ # limitations under the License. import shutil from pathlib import Path -from typing import List +from typing import Any, List from evadb.catalog.catalog_type import ( ColumnType, @@ -23,7 +23,6 @@ VideoColumnName, ) from evadb.catalog.catalog_utils import ( - cleanup_storage, construct_function_cache_catalog_entry, get_document_table_column_definitions, get_image_table_column_definitions, @@ -46,6 +45,9 @@ truncate_catalog_tables, ) from evadb.catalog.services.column_catalog_service import ColumnCatalogService +from evadb.catalog.services.configuration_catalog_service import ( + ConfigurationCatalogService, +) from evadb.catalog.services.database_catalog_service import DatabaseCatalogService from evadb.catalog.services.function_cache_catalog_service import ( FunctionCacheCatalogService, @@ -61,23 +63,28 @@ from evadb.catalog.services.index_catalog_service import IndexCatalogService from evadb.catalog.services.table_catalog_service import TableCatalogService from evadb.catalog.sql_config import IDENTIFIER_COLUMN, SQLConfig -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.expression.function_expression import FunctionExpression from evadb.parser.create_statement import ColumnDefinition from evadb.parser.table_ref import TableInfo from evadb.parser.types import FileFormatType from evadb.third_party.databases.interface import get_database_handler -from evadb.utils.generic_utils import generate_file_path, get_file_checksum +from evadb.utils.generic_utils import ( + generate_file_path, + get_file_checksum, + remove_directory_contents, +) from evadb.utils.logging_manager import logger class CatalogManager(object): - def __init__(self, db_uri: str, config: ConfigurationManager): + def __init__(self, db_uri: str): self._db_uri = db_uri self._sql_config = SQLConfig(db_uri) - self._config = config self._bootstrap_catalog() self._db_catalog_service = DatabaseCatalogService(self._sql_config.session) + self._config_catalog_service = ConfigurationCatalogService( + self._sql_config.session + ) self._table_catalog_service = TableCatalogService(self._sql_config.session) self._column_service = ColumnCatalogService(self._sql_config.session) self._function_service = FunctionCatalogService(self._sql_config.session) @@ -130,10 +137,14 @@ def _clear_catalog_contents(self): logger.info("Clearing catalog") # drop tables which are not part of catalog drop_all_tables_except_catalog(self._sql_config.engine) - # truncate the catalog tables - truncate_catalog_tables(self._sql_config.engine) + # truncate the catalog tables except configuration_catalog + # We do not remove the configuration entries + truncate_catalog_tables( + self._sql_config.engine, tables_not_to_truncate=["configuration_catalog"] + ) # clean up the dataset, index, and cache directories - cleanup_storage(self._config) + for folder in ["cache_dir", "index_dir", "datasets_dir"]: + remove_directory_contents(self.get_configuration_catalog_value(folder)) "Database catalog services" @@ -447,7 +458,7 @@ def get_all_index_catalog_entries(self): """ Function Cache related""" def insert_function_cache_catalog_entry(self, func_expr: FunctionExpression): - cache_dir = self._config.get_value("storage", "cache_dir") + cache_dir = self.get_configuration_catalog_value("cache_dir") entry = construct_function_cache_catalog_entry(func_expr, cache_dir=cache_dir) return self._function_cache_service.insert_entry(entry) @@ -510,7 +521,7 @@ def create_and_insert_table_catalog_entry( table_name = table_info.table_name column_catalog_entries = xform_column_definitions_to_catalog_entries(columns) - dataset_location = self._config.get_value("core", "datasets_dir") + dataset_location = self.get_configuration_catalog_value("datasets_dir") file_url = str(generate_file_path(dataset_location, table_name)) table_catalog_entry = self.insert_table_catalog_entry( table_name, @@ -610,14 +621,28 @@ def create_and_insert_multimedia_metadata_table_catalog_entry( ) return obj + "Configuration catalog services" + + def upsert_configuration_catalog_entry(self, key: str, value: any): + """Upserts configuration catalog entry" + + Args: + key: key name + value: value name + """ + self._config_catalog_service.upsert_entry(key, value) + + def get_configuration_catalog_value(self, key: str, default: Any = None) -> Any: + """ + Returns the value entry for the given key + Arguments: + key (str): key name + + Returns: + ConfigurationCatalogEntry + """ -#### get catalog instance -# This function plays a crucial role in ensuring that different threads do -# not share the same catalog object, as it can result in serialization issues and -# incorrect behavior with SQLAlchemy. Therefore, whenever a catalog instance is -# required, we create a new one. One possible optimization is to share the catalog -# instance across all objects within the same thread. It is worth investigating whether -# SQLAlchemy already handles this optimization for us, which will be explored at a -# later time. -def get_catalog_instance(db_uri: str, config: ConfigurationManager): - return CatalogManager(db_uri, config) + table_entry = self._config_catalog_service.get_entry_by_name(key) + if table_entry: + return table_entry.value + return default diff --git a/evadb/catalog/catalog_utils.py b/evadb/catalog/catalog_utils.py index d2187978d2..35fb7f6a87 100644 --- a/evadb/catalog/catalog_utils.py +++ b/evadb/catalog/catalog_utils.py @@ -32,11 +32,10 @@ TableCatalogEntry, ) from evadb.catalog.sql_config import IDENTIFIER_COLUMN -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.expression.function_expression import FunctionExpression from evadb.expression.tuple_value_expression import TupleValueExpression from evadb.parser.create_statement import ColConstraintInfo, ColumnDefinition -from evadb.utils.generic_utils import get_str_hash, remove_directory_contents +from evadb.utils.generic_utils import get_str_hash def is_video_table(table: TableCatalogEntry): @@ -256,12 +255,6 @@ def construct_function_cache_catalog_entry( return entry -def cleanup_storage(config): - remove_directory_contents(config.get_value("storage", "index_dir")) - remove_directory_contents(config.get_value("storage", "cache_dir")) - remove_directory_contents(config.get_value("core", "datasets_dir")) - - def get_metadata_entry_or_val( function_obj: FunctionCatalogEntry, key: str, default_val: Any = None ) -> str: @@ -300,6 +293,19 @@ def get_metadata_properties(function_obj: FunctionCatalogEntry) -> Dict: return properties +def bootstrap_configs(catalog, configs: dict): + """ + load all the configuration values into the catalog table configuration_catalog + """ + for key, value in configs.items(): + catalog.upsert_configuration_catalog_entry(key, value) + + +def get_configuration_value(key: str): + catalog = get_catalog_instance() + return catalog.get_configuration_catalog_value(key) + + #### get catalog instance # This function plays a crucial role in ensuring that different threads do # not share the same catalog object, as it can result in serialization issues and @@ -308,7 +314,7 @@ def get_metadata_properties(function_obj: FunctionCatalogEntry) -> Dict: # instance across all objects within the same thread. It is worth investigating whether # SQLAlchemy already handles this optimization for us, which will be explored at a # later time. -def get_catalog_instance(db_uri: str, config: ConfigurationManager): +def get_catalog_instance(db_uri: str): from evadb.catalog.catalog_manager import CatalogManager - return CatalogManager(db_uri, config) + return CatalogManager(db_uri) diff --git a/evadb/catalog/models/base_model.py b/evadb/catalog/models/base_model.py index 8e915af245..f31fc10b43 100644 --- a/evadb/catalog/models/base_model.py +++ b/evadb/catalog/models/base_model.py @@ -12,16 +12,10 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import contextlib - -import sqlalchemy from sqlalchemy import Column, Integer -from sqlalchemy.engine import Engine from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy_utils import database_exists -from evadb.catalog.sql_config import CATALOG_TABLES from evadb.utils.logging_manager import logger @@ -100,33 +94,3 @@ def _commit(self, db_session): # Custom Base Model to be inherited by all models BaseModel = declarative_base(cls=CustomModel, constructor=None) - - -def truncate_catalog_tables(engine: Engine): - """Truncate all the catalog tables""" - # https://stackoverflow.com/questions/4763472/sqlalchemy-clear-database-content-but-dont-drop-the-schema/5003705#5003705 #noqa - # reflect to refresh the metadata - BaseModel.metadata.reflect(bind=engine) - insp = sqlalchemy.inspect(engine) - if database_exists(engine.url): - with contextlib.closing(engine.connect()) as con: - trans = con.begin() - for table in reversed(BaseModel.metadata.sorted_tables): - if insp.has_table(table.name): - con.execute(table.delete()) - trans.commit() - - -def drop_all_tables_except_catalog(engine: Engine): - """drop all the tables except the catalog""" - # reflect to refresh the metadata - BaseModel.metadata.reflect(bind=engine) - insp = sqlalchemy.inspect(engine) - if database_exists(engine.url): - with contextlib.closing(engine.connect()) as con: - trans = con.begin() - for table in reversed(BaseModel.metadata.sorted_tables): - if table.name not in CATALOG_TABLES: - if insp.has_table(table.name): - table.drop(con) - trans.commit() diff --git a/evadb/catalog/models/configuration_catalog.py b/evadb/catalog/models/configuration_catalog.py new file mode 100644 index 0000000000..157b07eaf8 --- /dev/null +++ b/evadb/catalog/models/configuration_catalog.py @@ -0,0 +1,43 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from sqlalchemy import Column, String + +from evadb.catalog.models.base_model import BaseModel +from evadb.catalog.models.utils import ConfigurationCatalogEntry, TextPickleType + + +class ConfigurationCatalog(BaseModel): + """The `ConfigurationCatalog` catalog stores all the configuration params. + `_row_id:` an autogenerated unique identifier. + `_key:` the key for the config. + `_value:` the value for the config + """ + + __tablename__ = "configuration_catalog" + + _key = Column("key", String(100), unique=True) + _value = Column("value", TextPickleType()) + + def __init__(self, key: str, value: any): + self._key = key + self._value = value + + def as_dataclass(self) -> "ConfigurationCatalogEntry": + return ConfigurationCatalogEntry( + row_id=self._row_id, + key=self._key, + value=self._value, + ) diff --git a/evadb/catalog/models/utils.py b/evadb/catalog/models/utils.py index b1c067aa0b..5da3a2eef5 100644 --- a/evadb/catalog/models/utils.py +++ b/evadb/catalog/models/utils.py @@ -61,7 +61,7 @@ def init_db(engine: Engine): BaseModel.metadata.create_all(bind=engine) -def truncate_catalog_tables(engine: Engine): +def truncate_catalog_tables(engine: Engine, tables_not_to_truncate: List[str] = []): """Truncate all the catalog tables""" # https://stackoverflow.com/questions/4763472/sqlalchemy-clear-database-content-but-dont-drop-the-schema/5003705#5003705 #noqa # reflect to refresh the metadata @@ -71,8 +71,9 @@ def truncate_catalog_tables(engine: Engine): with contextlib.closing(engine.connect()) as con: trans = con.begin() for table in reversed(BaseModel.metadata.sorted_tables): - if insp.has_table(table.name): - con.execute(table.delete()) + if table.name not in tables_not_to_truncate: + if insp.has_table(table.name): + con.execute(table.delete()) trans.commit() @@ -257,3 +258,20 @@ def display_format(self): "engine": self.engine, "params": self.params, } + + +@dataclass(unsafe_hash=True) +class ConfigurationCatalogEntry: + """Dataclass representing an entry in the `ConfigurationCatalog`. + This is done to ensure we don't expose the sqlalchemy dependencies beyond catalog service. Further, sqlalchemy does not allow sharing of objects across threads. + """ + + key: str + value: str + row_id: int = None + + def display_format(self): + return { + "key": self.key, + "value": self.value, + } diff --git a/evadb/catalog/services/configuration_catalog_service.py b/evadb/catalog/services/configuration_catalog_service.py new file mode 100644 index 0000000000..bda22253c0 --- /dev/null +++ b/evadb/catalog/services/configuration_catalog_service.py @@ -0,0 +1,76 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from sqlalchemy.orm import Session +from sqlalchemy.sql.expression import select + +from evadb.catalog.models.configuration_catalog import ConfigurationCatalog +from evadb.catalog.models.utils import ConfigurationCatalogEntry +from evadb.catalog.services.base_service import BaseService +from evadb.utils.errors import CatalogError +from evadb.utils.logging_manager import logger + + +class ConfigurationCatalogService(BaseService): + def __init__(self, db_session: Session): + super().__init__(ConfigurationCatalog, db_session) + + def insert_entry( + self, + key: str, + value: any, + ): + try: + config_catalog_obj = self.model(key=key, value=value) + config_catalog_obj = config_catalog_obj.save(self.session) + + except Exception as e: + logger.exception( + f"Failed to insert entry into database catalog with exception {str(e)}" + ) + raise CatalogError(e) + + def get_entry_by_name(self, key: str) -> ConfigurationCatalogEntry: + """ + Get the table catalog entry with given table name. + Arguments: + key (str): key name + Returns: + Configuration Catalog Entry - catalog entry for given key name + """ + entry = self.session.execute( + select(self.model).filter(self.model._key == key) + ).scalar_one_or_none() + if entry: + return entry.as_dataclass() + return entry + + def upsert_entry( + self, + key: str, + value: any, + ): + try: + entry = self.session.execute( + select(self.model).filter(self.model._key == key) + ).scalar_one_or_none() + if entry: + entry.update(self.session, _value=value) + else: + self.insert_entry(key, value) + except Exception as e: + raise CatalogError( + f"Error while upserting entry to ConfigurationCatalog: {str(e)}" + ) diff --git a/evadb/catalog/services/function_cost_catalog_service.py b/evadb/catalog/services/function_cost_catalog_service.py index ac84e8c948..5e20ac3030 100644 --- a/evadb/catalog/services/function_cost_catalog_service.py +++ b/evadb/catalog/services/function_cost_catalog_service.py @@ -62,7 +62,7 @@ def upsert_entry(self, function_id: int, name: str, new_cost: int): select(self.model).filter(self.model._function_id == function_id) ).scalar_one_or_none() if function_obj: - function_obj.update(self.session, cost=new_cost) + function_obj.update(self.session, _cost=new_cost) else: self.insert_entry(function_id, name, new_cost) except Exception as e: diff --git a/evadb/catalog/sql_config.py b/evadb/catalog/sql_config.py index 778d2cb248..0a460a899d 100644 --- a/evadb/catalog/sql_config.py +++ b/evadb/catalog/sql_config.py @@ -17,9 +17,6 @@ from sqlalchemy import create_engine, event from sqlalchemy.orm import scoped_session, sessionmaker -from sqlalchemy.pool import NullPool - -from evadb.utils.generic_utils import is_postgres_uri, parse_config_yml # Permanent identifier column. IDENTIFIER_COLUMN = "_row_id" @@ -32,6 +29,7 @@ "column_catalog", "table_catalog", "database_catalog", + "configuration_catalog", "depend_column_and_function_cache", "function_cache", "function_catalog", @@ -65,33 +63,17 @@ def __call__(cls, uri): class SQLConfig(metaclass=SingletonMeta): def __init__(self, uri): - """Initializes the engine and session for database operations - - Retrieves the database uri for connection from ConfigurationManager. - """ + """Initializes the engine and session for database operations""" self.worker_uri = str(uri) # set echo=True to log SQL - connect_args = {} - config_obj = parse_config_yml() - if is_postgres_uri(config_obj["core"]["catalog_database_uri"]): - # Set the arguments for postgres backend. - connect_args = {"connect_timeout": 1000} - # https://www.oddbird.net/2014/06/14/sqlalchemy-postgres-autocommit/ - self.engine = create_engine( - self.worker_uri, - poolclass=NullPool, - isolation_level="AUTOCOMMIT", - connect_args=connect_args, - ) - else: - # Default to SQLite. - connect_args = {"timeout": 1000} - self.engine = create_engine( - self.worker_uri, - connect_args=connect_args, - ) + # Default to SQLite. + connect_args = {"timeout": 1000} + self.engine = create_engine( + self.worker_uri, + connect_args=connect_args, + ) if self.engine.url.get_backend_name() == "sqlite": # enforce foreign key constraint and wal logging for sqlite diff --git a/evadb/configuration/bootstrap_environment.py b/evadb/configuration/bootstrap_environment.py index 55e2f0f228..bb108692a4 100644 --- a/evadb/configuration/bootstrap_environment.py +++ b/evadb/configuration/bootstrap_environment.py @@ -12,13 +12,10 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import importlib.resources as importlib_resources import logging from pathlib import Path from typing import Union -import yaml - from evadb.configuration.constants import ( CACHE_DIR, DB_DEFAULT_NAME, @@ -27,26 +24,12 @@ MODEL_DIR, S3_DOWNLOAD_DIR, TMP_DIR, - EvaDB_CONFIG_FILE, EvaDB_DATASET_DIR, ) -from evadb.utils.generic_utils import parse_config_yml +from evadb.evadb_config import BASE_EVADB_CONFIG from evadb.utils.logging_manager import logger as evadb_logger -def get_base_config(evadb_installation_dir: Path) -> Path: - """ - Get path to .evadb.yml source path. - """ - # if evadb package is installed in environment - if importlib_resources.is_resource("evadb", EvaDB_CONFIG_FILE): - with importlib_resources.path("evadb", EvaDB_CONFIG_FILE) as yml_path: - return yml_path - else: - # For local dev environments without package installed - return evadb_installation_dir / EvaDB_CONFIG_FILE - - def get_default_db_uri(evadb_dir: Path): """ Get the default database uri. @@ -54,12 +37,8 @@ def get_default_db_uri(evadb_dir: Path): Arguments: evadb_dir: path to evadb database directory """ - config_obj = parse_config_yml() - if config_obj["core"]["catalog_database_uri"]: - return config_obj["core"]["catalog_database_uri"] - else: - # Default to sqlite. - return f"sqlite:///{evadb_dir.resolve()}/{DB_DEFAULT_NAME}" + # Default to sqlite. + return f"sqlite:///{evadb_dir.resolve()}/{DB_DEFAULT_NAME}" def bootstrap_environment(evadb_dir: Path, evadb_installation_dir: Path): @@ -71,7 +50,7 @@ def bootstrap_environment(evadb_dir: Path, evadb_installation_dir: Path): evadb_installation_dir: path to evadb package """ - default_config_path = get_base_config(evadb_installation_dir).resolve() + config_obj = BASE_EVADB_CONFIG # creates necessary directories config_default_dict = create_directories_and_get_default_config_values( @@ -80,22 +59,22 @@ def bootstrap_environment(evadb_dir: Path, evadb_installation_dir: Path): assert evadb_dir.exists(), f"{evadb_dir} does not exist" assert evadb_installation_dir.exists(), f"{evadb_installation_dir} does not exist" - config_obj = {} - with default_config_path.open("r") as yml_file: - config_obj = yaml.load(yml_file, Loader=yaml.FullLoader) config_obj = merge_dict_of_dicts(config_default_dict, config_obj) - mode = config_obj["core"]["mode"] + mode = config_obj["mode"] # set logger to appropriate level (debug or release) level = logging.WARN if mode == "release" else logging.DEBUG evadb_logger.setLevel(level) evadb_logger.debug(f"Setting logging level to: {str(level)}") + # Mainly want to add all the configs to sqlite + return config_obj +# TODO : Change def create_directories_and_get_default_config_values( - evadb_dir: Path, evadb_installation_dir: Path, category: str = None, key: str = None + evadb_dir: Path, evadb_installation_dir: Path ) -> Union[dict, str]: default_install_dir = evadb_installation_dir dataset_location = evadb_dir / EvaDB_DATASET_DIR @@ -124,21 +103,15 @@ def create_directories_and_get_default_config_values( model_dir.mkdir(parents=True, exist_ok=True) config_obj = {} - config_obj["core"] = {} - config_obj["storage"] = {} - config_obj["core"]["evadb_installation_dir"] = str(default_install_dir.resolve()) - config_obj["core"]["datasets_dir"] = str(dataset_location.resolve()) - config_obj["core"]["catalog_database_uri"] = get_default_db_uri(evadb_dir) - config_obj["storage"]["index_dir"] = str(index_dir.resolve()) - config_obj["storage"]["cache_dir"] = str(cache_dir.resolve()) - config_obj["storage"]["s3_download_dir"] = str(s3_dir.resolve()) - config_obj["storage"]["tmp_dir"] = str(tmp_dir.resolve()) - config_obj["storage"]["function_dir"] = str(function_dir.resolve()) - config_obj["storage"]["model_dir"] = str(model_dir.resolve()) - if category and key: - return config_obj.get(category, {}).get(key, None) - elif category: - return config_obj.get(category, {}) + config_obj["evadb_installation_dir"] = str(default_install_dir.resolve()) + config_obj["datasets_dir"] = str(dataset_location.resolve()) + config_obj["catalog_database_uri"] = get_default_db_uri(evadb_dir) + config_obj["index_dir"] = str(index_dir.resolve()) + config_obj["cache_dir"] = str(cache_dir.resolve()) + config_obj["s3_download_dir"] = str(s3_dir.resolve()) + config_obj["tmp_dir"] = str(tmp_dir.resolve()) + config_obj["function_dir"] = str(function_dir.resolve()) + config_obj["model_dir"] = str(model_dir.resolve()) return config_obj @@ -147,15 +120,14 @@ def merge_dict_of_dicts(dict1, dict2): merged_dict = dict1.copy() for key, value in dict2.items(): - # Overwrite only if some value is specified. - if value: - if ( - key in merged_dict - and isinstance(merged_dict[key], dict) - and isinstance(value, dict) - ): - merged_dict[key] = merge_dict_of_dicts(merged_dict[key], value) - else: - merged_dict[key] = value + if key in merged_dict.keys(): + # Overwrite only if some value is specified. + if value is not None: + if isinstance(merged_dict[key], dict) and isinstance(value, dict): + merged_dict[key] = merge_dict_of_dicts(merged_dict[key], value) + else: + merged_dict[key] = value + else: + merged_dict[key] = value return merged_dict diff --git a/evadb/configuration/configuration_manager.py b/evadb/configuration/configuration_manager.py deleted file mode 100644 index 8d209e2fcf..0000000000 --- a/evadb/configuration/configuration_manager.py +++ /dev/null @@ -1,71 +0,0 @@ -# coding=utf-8 -# Copyright 2018-2023 EvaDB -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -from pathlib import Path -from typing import Any - -from evadb.configuration.bootstrap_environment import bootstrap_environment -from evadb.configuration.constants import EvaDB_DATABASE_DIR, EvaDB_INSTALLATION_DIR -from evadb.utils.logging_manager import logger - - -class ConfigurationManager(object): - def __init__(self, evadb_dir: str = None) -> None: - self._evadb_dir = evadb_dir or EvaDB_DATABASE_DIR - self._config_obj = self._create_if_not_exists() - - def _create_if_not_exists(self): - config_obj = bootstrap_environment( - evadb_dir=Path(self._evadb_dir), - evadb_installation_dir=Path(EvaDB_INSTALLATION_DIR), - ) - return config_obj - - def _get(self, category: str, key: str) -> Any: - """Retrieve a configuration value based on the category and key. - - Args: - category (str): The category of the configuration. - key (str): The key of the configuration within the category. - - Returns: - Any: The retrieved configuration value. - - Raises: - ValueError: If the YAML file is invalid or cannot be loaded. - """ - config_obj = self._config_obj - - # Get value from the user-provided config file - value = config_obj.get(category, {}).get(key) - - # cannot find the value, report invalid category, key combination - if value is None: - logger.exception(f"Invalid category and key combination {category}:{key}") - - return value - - def _update(self, category: str, key: str, value: str): - config_obj = self._config_obj - - if category not in config_obj: - config_obj[category] = {} - - config_obj[category][key] = value - - def get_value(self, category: str, key: str) -> Any: - return self._get(category, key) - - def update_value(self, category, key, value) -> None: - self._update(category, key, value) diff --git a/evadb/configuration/constants.py b/evadb/configuration/constants.py index 395f898be9..18a1331f83 100644 --- a/evadb/configuration/constants.py +++ b/evadb/configuration/constants.py @@ -21,7 +21,7 @@ EvaDB_DATABASE_DIR = "evadb_data" EvaDB_APPS_DIR = "apps" EvaDB_DATASET_DIR = "evadb_datasets" -EvaDB_CONFIG_FILE = "evadb.yml" +EvaDB_CONFIG_FILE = "evadb_config.py" FUNCTION_DIR = "functions" MODEL_DIR = "models" CATALOG_DIR = "catalog" diff --git a/evadb/database.py b/evadb/database.py index ed6ad2f118..9c22d5b9ff 100644 --- a/evadb/database.py +++ b/evadb/database.py @@ -16,10 +16,13 @@ from pathlib import Path from typing import TYPE_CHECKING, Callable -from evadb.catalog.catalog_utils import get_catalog_instance -from evadb.configuration.configuration_manager import ConfigurationManager -from evadb.configuration.constants import DB_DEFAULT_NAME, EvaDB_DATABASE_DIR -from evadb.utils.generic_utils import parse_config_yml +from evadb.catalog.catalog_utils import bootstrap_configs, get_catalog_instance +from evadb.configuration.bootstrap_environment import bootstrap_environment +from evadb.configuration.constants import ( + DB_DEFAULT_NAME, + EvaDB_DATABASE_DIR, + EvaDB_INSTALLATION_DIR, +) if TYPE_CHECKING: from evadb.catalog.catalog_manager import CatalogManager @@ -28,7 +31,6 @@ @dataclass class EvaDBDatabase: db_uri: str - config: ConfigurationManager catalog_uri: str catalog_func: Callable @@ -36,16 +38,12 @@ def catalog(self) -> "CatalogManager": """ Note: Generating an object on demand plays a crucial role in ensuring that different threads do not share the same catalog object, as it can result in serialization issues and incorrect behavior with SQLAlchemy. Refer to get_catalog_instance() """ - return self.catalog_func(self.catalog_uri, self.config) + return self.catalog_func(self.catalog_uri) def get_default_db_uri(evadb_dir: Path): - config_obj = parse_config_yml() - if config_obj["core"]["catalog_database_uri"]: - return config_obj["core"]["catalog_database_uri"] - else: - # Default to sqlite. - return f"sqlite:///{evadb_dir.resolve()}/{DB_DEFAULT_NAME}" + # Default to sqlite. + return f"sqlite:///{evadb_dir.resolve()}/{DB_DEFAULT_NAME}" def init_evadb_instance( @@ -53,8 +51,15 @@ def init_evadb_instance( ): if db_dir is None: db_dir = EvaDB_DATABASE_DIR - config = ConfigurationManager(db_dir) + + config_obj = bootstrap_environment( + Path(db_dir), + evadb_installation_dir=Path(EvaDB_INSTALLATION_DIR), + ) catalog_uri = custom_db_uri or get_default_db_uri(Path(db_dir)) - return EvaDBDatabase(db_dir, config, catalog_uri, get_catalog_instance) + # load all the config into the configuration_catalog table + bootstrap_configs(get_catalog_instance(catalog_uri), config_obj) + + return EvaDBDatabase(db_dir, catalog_uri, get_catalog_instance) diff --git a/evadb/evadb.yml b/evadb/evadb.yml deleted file mode 100644 index 04ce32549b..0000000000 --- a/evadb/evadb.yml +++ /dev/null @@ -1,30 +0,0 @@ -core: - evadb_installation_dir: "" - datasets_dir: "" - catalog_database_uri: "" - application: "evadb" - mode: "release" #release or debug - -executor: - # batch_mem_size configures the number of rows processed by the execution engine in one iteration - # rows = max(1, row_mem_size / batch_mem_size) - batch_mem_size: 30000000 - - # batch size used for gpu_operations - gpu_batch_size: 1 - - gpu_ids: [0] - -server: - host: "0.0.0.0" - port: 8803 - socket_timeout: 60 - -experimental: - ray: False - -third_party: - OPENAI_KEY: "" - PINECONE_API_KEY: "" - PINECONE_ENV: "" - REPLICATE_API_TOKEN: "" \ No newline at end of file diff --git a/evadb/evadb_cmd_client.py b/evadb/evadb_cmd_client.py index 3286b68fa3..2f15f075d5 100644 --- a/evadb/evadb_cmd_client.py +++ b/evadb/evadb_cmd_client.py @@ -26,7 +26,7 @@ EvaDB_CODE_DIR = abspath(join(THIS_DIR, "..")) sys.path.append(EvaDB_CODE_DIR) -from evadb.configuration.configuration_manager import ConfigurationManager # noqa: E402 +from evadb.evadb_config import BASE_EVADB_CONFIG # noqa: E402 from evadb.server.interpreter import start_cmd_client # noqa: E402 @@ -61,13 +61,9 @@ def main(): # PARSE ARGS args, unknown = parser.parse_known_args() - host = ( - args.host if args.host else ConfigurationManager().get_value("server", "host") - ) + host = args.host if args.host else BASE_EVADB_CONFIG["host"] - port = ( - args.port if args.port else ConfigurationManager().get_value("server", "port") - ) + port = args.port if args.port else BASE_EVADB_CONFIG["port"] asyncio.run(evadb_client(host, port)) diff --git a/evadb/evadb_config.py b/evadb/evadb_config.py new file mode 100644 index 0000000000..800112a601 --- /dev/null +++ b/evadb/evadb_config.py @@ -0,0 +1,39 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +EvaDB configuration dict + +batch_mem_size configures the number of rows processed by the execution engine in one iteration +rows = max(1, row_mem_size / batch_mem_size) +""" + +BASE_EVADB_CONFIG = { + "evadb_installation_dir": "", + "datasets_dir": "", + "catalog_database_uri": "", + "application": "evadb", + "mode": "release", + "batch_mem_size": 30000000, + "gpu_batch_size": 1, # batch size used for gpu_operations + "gpu_ids": [0], + "host": "0.0.0.0", + "port": 8803, + "socket_timeout": 60, + "ray": False, + "OPENAI_API_KEY": "", + "PINECONE_API_KEY": "", + "PINECONE_ENV": "", +} diff --git a/evadb/executor/abstract_executor.py b/evadb/executor/abstract_executor.py index 66a453f71d..8647901460 100644 --- a/evadb/executor/abstract_executor.py +++ b/evadb/executor/abstract_executor.py @@ -18,7 +18,6 @@ if TYPE_CHECKING: from evadb.catalog.catalog_manager import CatalogManager -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.database import EvaDBDatabase from evadb.models.storage.batch import Batch from evadb.plan_nodes.abstract_plan import AbstractPlan @@ -36,7 +35,6 @@ class AbstractExecutor(ABC): def __init__(self, db: EvaDBDatabase, node: AbstractPlan): self._db = db self._node = node - self._config: ConfigurationManager = db.config if db else None self._children = [] # @lru_cache(maxsize=None) @@ -74,10 +72,6 @@ def node(self) -> AbstractPlan: def db(self) -> EvaDBDatabase: return self._db - @property - def config(self) -> ConfigurationManager: - return self._config - @abstractmethod def exec(self, *args, **kwargs) -> Iterable[Batch]: """ diff --git a/evadb/executor/create_function_executor.py b/evadb/executor/create_function_executor.py index 367110b1d8..d045205a65 100644 --- a/evadb/executor/create_function_executor.py +++ b/evadb/executor/create_function_executor.py @@ -129,10 +129,13 @@ def handle_ludwig_function(self): target=arg_map["predict"], tune_for_memory=arg_map.get("tune_for_memory", False), time_limit_s=arg_map.get("time_limit", DEFAULT_TRAIN_TIME_LIMIT), - output_directory=self.db.config.get_value("storage", "tmp_dir"), + output_directory=self.db.catalog().get_configuration_catalog_value( + "tmp_dir" + ), ) model_path = os.path.join( - self.db.config.get_value("storage", "model_dir"), self.node.name + self.db.catalog().get_configuration_catalog_value("model_dir"), + self.node.name, ) auto_train_results.best_model.save(model_path) self.node.metadata.append( @@ -176,7 +179,8 @@ def handle_sklearn_function(self): aggregated_batch.frames.drop([arg_map["predict"]], axis=1, inplace=True) model.fit(X=aggregated_batch.frames, y=Y) model_path = os.path.join( - self.db.config.get_value("storage", "model_dir"), self.node.name + self.db.catalog().get_configuration_catalog_value("model_dir"), + self.node.name, ) pickle.dump(model, open(model_path, "wb")) self.node.metadata.append( @@ -475,7 +479,7 @@ def get_optuna_config(trial): model_save_dir_name += "_exogenous_" + str(sorted(exogenous_columns)) model_dir = os.path.join( - self.db.config.get_value("storage", "model_dir"), + self.db.catalog().get_configuration_catalog_value("model_dir"), "tsforecasting", model_save_dir_name, str(hashlib.sha256(data.to_string().encode()).hexdigest()), diff --git a/evadb/executor/create_index_executor.py b/evadb/executor/create_index_executor.py index 407cfef3c0..4b5c164745 100644 --- a/evadb/executor/create_index_executor.py +++ b/evadb/executor/create_index_executor.py @@ -75,7 +75,7 @@ def _create_native_index(self): # On-disk saving path for EvaDB index. def _get_evadb_index_save_path(self) -> Path: - index_dir = Path(self.config.get_value("storage", "index_dir")) + index_dir = Path(self.db.catalog().get_configuration_catalog_value("index_dir")) if not index_dir.exists(): index_dir.mkdir(parents=True, exist_ok=True) return str( @@ -121,7 +121,7 @@ def _create_evadb_index(self): self.vector_store_type, self.name, **handle_vector_store_params( - self.vector_store_type, index_path + self.vector_store_type, index_path, self.catalog ), ) else: @@ -151,7 +151,7 @@ def _create_evadb_index(self): self.vector_store_type, self.name, **handle_vector_store_params( - self.vector_store_type, index_path + self.vector_store_type, index_path, self.catalog ), ) index.create(input_dim) diff --git a/evadb/executor/drop_object_executor.py b/evadb/executor/drop_object_executor.py index 38d5419dc4..a857f15eae 100644 --- a/evadb/executor/drop_object_executor.py +++ b/evadb/executor/drop_object_executor.py @@ -118,7 +118,9 @@ def _handle_drop_index(self, index_name: str, if_exists: bool): index = VectorStoreFactory.init_vector_store( index_obj.type, index_obj.name, - **handle_vector_store_params(index_obj.type, index_obj.save_file_path), + **handle_vector_store_params( + index_obj.type, index_obj.save_file_path, self.catalog + ), ) assert ( index is not None diff --git a/evadb/executor/execution_context.py b/evadb/executor/execution_context.py index d5feea4648..b0b5e1a696 100644 --- a/evadb/executor/execution_context.py +++ b/evadb/executor/execution_context.py @@ -16,7 +16,6 @@ import random from typing import List -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.constants import NO_GPU from evadb.utils.generic_utils import get_gpu_count, is_gpu_available @@ -28,13 +27,8 @@ class Context: if using horovod: current rank etc. """ - def __new__(cls): - if not hasattr(cls, "_instance"): - cls._instance = super(Context, cls).__new__(cls) - return cls._instance - - def __init__(self): - self._config_manager = ConfigurationManager() + def __init__(self, user_provided_gpu_conf=[]): + self._user_provided_gpu_conf = user_provided_gpu_conf self._gpus = self._populate_gpu_ids() @property @@ -42,10 +36,8 @@ def gpus(self): return self._gpus def _populate_gpu_from_config(self) -> List: - # Populate GPU IDs from yaml config file. - gpu_conf = self._config_manager.get_value("executor", "gpu_ids") available_gpus = [i for i in range(get_gpu_count())] - return list(set(available_gpus) & set(gpu_conf)) + return list(set(available_gpus) & set(self._user_provided_gpu_conf)) def _populate_gpu_from_env(self) -> List: # Populate GPU IDs from env variable. diff --git a/evadb/executor/executor_utils.py b/evadb/executor/executor_utils.py index 23987ea153..9c2c3d5dbc 100644 --- a/evadb/executor/executor_utils.py +++ b/evadb/executor/executor_utils.py @@ -156,7 +156,7 @@ def validate_media(file_path: Path, media_type: FileFormatType) -> bool: def handle_vector_store_params( - vector_store_type: VectorStoreType, index_path: str + vector_store_type: VectorStoreType, index_path: str, catalog ) -> dict: """Handle vector store parameters based on the vector store type and index path. @@ -178,7 +178,13 @@ def handle_vector_store_params( elif vector_store_type == VectorStoreType.CHROMADB: return {"index_path": str(Path(index_path).parent)} elif vector_store_type == VectorStoreType.PINECONE: - return {} + # add the required API_KEYS + return { + "PINECONE_API_KEY": catalog().get_configuration_catalog_value( + "PINECONE_API_KEY" + ), + "PINECONE_ENV": catalog().get_configuration_catalog_value("PINECONE_ENV"), + } else: raise ValueError("Unsupported vector store type: {}".format(vector_store_type)) diff --git a/evadb/executor/load_multimedia_executor.py b/evadb/executor/load_multimedia_executor.py index 90bc7edba3..03f1f7fb64 100644 --- a/evadb/executor/load_multimedia_executor.py +++ b/evadb/executor/load_multimedia_executor.py @@ -53,7 +53,9 @@ def exec(self, *args, **kwargs): # If it is a s3 path, download the file to local if self.node.file_path.as_posix().startswith("s3:/"): - s3_dir = Path(self.config.get_value("storage", "s3_download_dir")) + s3_dir = Path( + self.catalog().get_configuration_catalog_value("s3_download_dir") + ) dst_path = s3_dir / self.node.table_info.table_name dst_path.mkdir(parents=True, exist_ok=True) video_files = download_from_s3(self.node.file_path, dst_path) diff --git a/evadb/executor/set_executor.py b/evadb/executor/set_executor.py index f399e3839a..309fe2747c 100644 --- a/evadb/executor/set_executor.py +++ b/evadb/executor/set_executor.py @@ -36,8 +36,8 @@ def exec(self, *args, **kwargs): as a separate PR for the issue #1140, where all instances of config use will be replaced """ - self._config.update_value( - category="default", - key=self.node.config_name.upper(), + + self.catalog().upsert_configuration_catalog_entry( + key=self.node.config_name, value=self.node.config_value.value, ) diff --git a/evadb/executor/show_info_executor.py b/evadb/executor/show_info_executor.py index 96dc0a537f..16871b8435 100644 --- a/evadb/executor/show_info_executor.py +++ b/evadb/executor/show_info_executor.py @@ -51,8 +51,7 @@ def exec(self, *args, **kwargs): for db in databases: show_entries.append(db.display_format()) elif self.node.show_type is ShowType.CONFIG: - value = self._config.get_value( - category="default", + value = self.catalog().get_configuration_catalog_value( key=self.node.show_val.upper(), ) show_entries = {} diff --git a/evadb/executor/vector_index_scan_executor.py b/evadb/executor/vector_index_scan_executor.py index 2b58f5c337..b2e1bb219e 100644 --- a/evadb/executor/vector_index_scan_executor.py +++ b/evadb/executor/vector_index_scan_executor.py @@ -102,7 +102,9 @@ def _evadb_vector_index_scan(self, *args, **kwargs): self.index = VectorStoreFactory.init_vector_store( self.vector_store_type, self.index_name, - **handle_vector_store_params(self.vector_store_type, self.index_path), + **handle_vector_store_params( + self.vector_store_type, self.index_path, self.db.catalog + ), ) search_feat = self._get_search_query_results() diff --git a/evadb/functions/abstract/pytorch_abstract_function.py b/evadb/functions/abstract/pytorch_abstract_function.py index 763f3658f7..49e531655e 100644 --- a/evadb/functions/abstract/pytorch_abstract_function.py +++ b/evadb/functions/abstract/pytorch_abstract_function.py @@ -17,7 +17,6 @@ import pandas as pd from numpy.typing import ArrayLike -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.functions.abstract.abstract_function import ( AbstractClassifierFunction, AbstractTransformationFunction, @@ -74,7 +73,8 @@ def __call__(self, *args, **kwargs) -> pd.DataFrame: if isinstance(frames, pd.DataFrame): frames = frames.transpose().values.tolist()[0] - gpu_batch_size = ConfigurationManager().get_value("executor", "gpu_batch_size") + # hardcoding it for now, need to be fixed @xzdandy + gpu_batch_size = 1 import torch tens_batch = torch.cat([self.transform(x) for x in frames]).to( diff --git a/evadb/functions/chatgpt.py b/evadb/functions/chatgpt.py index 61253116fe..fadc61191a 100644 --- a/evadb/functions/chatgpt.py +++ b/evadb/functions/chatgpt.py @@ -20,7 +20,6 @@ from retry import retry from evadb.catalog.catalog_type import NdArrayType -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.functions.abstract.abstract_function import AbstractFunction from evadb.functions.decorators.decorators import forward, setup from evadb.functions.decorators.io_descriptors.data_types import PandasDataframe @@ -85,10 +84,12 @@ def setup( self, model="gpt-3.5-turbo", temperature: float = 0, + openai_api_key="", ) -> None: assert model in _VALID_CHAT_COMPLETION_MODEL, f"Unsupported ChatGPT {model}" self.model = model self.temperature = temperature + self.openai_api_key = openai_api_key @forward( input_signatures=[ @@ -120,14 +121,12 @@ def forward(self, text_df): def completion_with_backoff(**kwargs): return openai.ChatCompletion.create(**kwargs) - # Register API key, try configuration manager first - openai.api_key = ConfigurationManager().get_value("third_party", "OPENAI_KEY") - # If not found, try OS Environment Variable + openai.api_key = self.openai_api_key if len(openai.api_key) == 0: - openai.api_key = os.environ.get("OPENAI_KEY", "") + openai.api_key = os.environ.get("OPENAI_API_KEY", "") assert ( len(openai.api_key) != 0 - ), "Please set your OpenAI API key in evadb.yml file (third_party, open_api_key) or environment variable (OPENAI_KEY)" + ), "Please set your OpenAI API key using SET OPENAI_API_KEY = 'sk-' or environment variable (OPENAI_API_KEY)" queries = text_df[text_df.columns[0]] content = text_df[text_df.columns[0]] diff --git a/evadb/functions/dalle.py b/evadb/functions/dalle.py index d373fda383..7c1dc39dd0 100644 --- a/evadb/functions/dalle.py +++ b/evadb/functions/dalle.py @@ -22,7 +22,6 @@ from PIL import Image from evadb.catalog.catalog_type import NdArrayType -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.functions.abstract.abstract_function import AbstractFunction from evadb.functions.decorators.decorators import forward from evadb.functions.decorators.io_descriptors.data_types import PandasDataframe @@ -34,8 +33,8 @@ class DallEFunction(AbstractFunction): def name(self) -> str: return "DallE" - def setup(self) -> None: - pass + def setup(self, openai_api_key="") -> None: + self.openai_api_key = openai_api_key @forward( input_signatures=[ @@ -59,14 +58,13 @@ def forward(self, text_df): try_to_import_openai() import openai - # Register API key, try configuration manager first - openai.api_key = ConfigurationManager().get_value("third_party", "OPENAI_KEY") + openai.api_key = self.openai_api_key # If not found, try OS Environment Variable - if openai.api_key is None or len(openai.api_key) == 0: - openai.api_key = os.environ.get("OPENAI_KEY", "") + if len(openai.api_key) == 0: + openai.api_key = os.environ.get("OPENAI_API_KEY", "") assert ( len(openai.api_key) != 0 - ), "Please set your OpenAI API key in evadb.yml file (third_party, open_api_key) or environment variable (OPENAI_KEY)" + ), "Please set your OpenAI API key using SET OPENAI_API_KEY = 'sk-' or environment variable (OPENAI_API_KEY)" def generate_image(text_df: PandasDataframe): results = [] diff --git a/evadb/functions/stable_diffusion.py b/evadb/functions/stable_diffusion.py index 0441955476..1ceaefe7e3 100644 --- a/evadb/functions/stable_diffusion.py +++ b/evadb/functions/stable_diffusion.py @@ -22,7 +22,6 @@ from PIL import Image from evadb.catalog.catalog_type import NdArrayType -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.functions.abstract.abstract_function import AbstractFunction from evadb.functions.decorators.decorators import forward from evadb.functions.decorators.io_descriptors.data_types import PandasDataframe @@ -34,10 +33,8 @@ class StableDiffusion(AbstractFunction): def name(self) -> str: return "StableDiffusion" - def setup( - self, - ) -> None: - pass + def setup(self, replicate_api_token="") -> None: + self.replicate_api_token = replicate_api_token @forward( input_signatures=[ @@ -64,16 +61,13 @@ def forward(self, text_df): try_to_import_replicate() import replicate - # Register API key, try configuration manager first - replicate_api_key = ConfigurationManager().get_value( - "third_party", "REPLICATE_API_TOKEN" - ) + replicate_api_key = self.replicate_api_token # If not found, try OS Environment Variable if replicate_api_key is None: replicate_api_key = os.environ.get("REPLICATE_API_TOKEN", "") assert ( len(replicate_api_key) != 0 - ), "Please set your Replicate API key in evadb.yml file (third_party, replicate_api_token) or environment variable (REPLICATE_API_TOKEN)" + ), "Please set your Replicate API key using SET REPLICATE_API_TOKEN = '' or set the environment variable (REPLICATE_API_TOKEN)" os.environ["REPLICATE_API_TOKEN"] = replicate_api_key model_id = ( diff --git a/evadb/optimizer/optimizer_context.py b/evadb/optimizer/optimizer_context.py index 6cb72dfd82..721cb5b928 100644 --- a/evadb/optimizer/optimizer_context.py +++ b/evadb/optimizer/optimizer_context.py @@ -43,7 +43,9 @@ def __init__( self._task_stack = OptimizerTaskStack() self._memo = Memo() self._cost_model = cost_model - self._rules_manager = rules_manager or RulesManager(db.config) + # check if ray is enabled + is_ray_enabled = self.db.catalog().get_configuration_catalog_value("ray") + self._rules_manager = rules_manager or RulesManager({"ray": is_ray_enabled}) @property def db(self): diff --git a/evadb/optimizer/plan_generator.py b/evadb/optimizer/plan_generator.py index 5b8c6d2a24..5396f4b939 100644 --- a/evadb/optimizer/plan_generator.py +++ b/evadb/optimizer/plan_generator.py @@ -39,7 +39,9 @@ def __init__( cost_model: CostModel = None, ) -> None: self.db = db - self.rules_manager = rules_manager or RulesManager(db.config) + # check if ray is enabled + is_ray_enabled = self.db.catalog().get_configuration_catalog_value("ray") + self.rules_manager = rules_manager or RulesManager({"ray": is_ray_enabled}) self.cost_model = cost_model or CostModel() def execute_task_stack(self, task_stack: OptimizerTaskStack): diff --git a/evadb/optimizer/rules/rules.py b/evadb/optimizer/rules/rules.py index 8e18e4d70b..cb9ff32742 100644 --- a/evadb/optimizer/rules/rules.py +++ b/evadb/optimizer/rules/rules.py @@ -836,7 +836,10 @@ def apply(self, before: LogicalCreateIndex, context: OptimizerContext): before.index_def, ) child = SeqScanPlan(None, before.project_expr_list, before.table_ref.alias) - batch_mem_size = context.db.config.get_value("executor", "batch_mem_size") + + batch_mem_size = context.db.catalog().get_configuration_catalog_value( + "batch_mem_size" + ) child.append_child( StoragePlan( before.table_ref.table.table_obj, @@ -933,7 +936,9 @@ def apply(self, before: LogicalGet, context: OptimizerContext): # read in a batch from storage engine. # Todo: Experiment heuristics. after = SeqScanPlan(None, before.target_list, before.alias) - batch_mem_size = context.db.config.get_value("executor", "batch_mem_size") + batch_mem_size = context.db.catalog().get_configuration_catalog_value( + "batch_mem_size" + ) after.append_child( StoragePlan( before.table_obj, diff --git a/evadb/optimizer/rules/rules_manager.py b/evadb/optimizer/rules/rules_manager.py index e9720b78d5..cc88a9575d 100644 --- a/evadb/optimizer/rules/rules_manager.py +++ b/evadb/optimizer/rules/rules_manager.py @@ -17,7 +17,6 @@ from contextlib import contextmanager from typing import List -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.optimizer.rules.rules import ( CacheFunctionExpressionInApply, CacheFunctionExpressionInFilter, @@ -67,7 +66,7 @@ class RulesManager: - def __init__(self, config: ConfigurationManager): + def __init__(self, configs: dict = {}): self._logical_rules = [ LogicalInnerJoinCommutativity(), CacheFunctionExpressionInApply(), @@ -121,9 +120,9 @@ def __init__(self, config: ConfigurationManager): # These rules are enabled only if # (1) ray is installed and (2) ray is enabled # Ray must be installed using pip - # It must also be enabled in "evadb.yml" + # It must also be enabled using the SET command # NOTE: By default, it is not enabled - ray_enabled = config.get_value("experimental", "ray") + ray_enabled = configs.get("ray", False) if is_ray_enabled_and_installed(ray_enabled): self._implementation_rules.extend( [ diff --git a/evadb/parser/evadb.lark b/evadb/parser/evadb.lark index e834d1a7d0..d3f455fbb6 100644 --- a/evadb/parser/evadb.lark +++ b/evadb/parser/evadb.lark @@ -84,7 +84,7 @@ set_statement: SET config_name (EQUAL_SYMBOL | TO) config_value config_name: uid -config_value: (string_literal | decimal_literal | boolean_literal | real_literal) +config_value: constant // Data Manipulation Language diff --git a/evadb/server/server.py b/evadb/server/server.py index 0105279a32..9f33dced0d 100644 --- a/evadb/server/server.py +++ b/evadb/server/server.py @@ -49,7 +49,7 @@ async def start_evadb_server( self._server = await asyncio.start_server(self.accept_client, host, port) # load built-in functions - mode = self._evadb.config.get_value("core", "mode") + mode = self._evadb.catalog().get_configuration_catalog_value("mode") init_builtin_functions(self._evadb, mode=mode) async with self._server: diff --git a/evadb/third_party/vector_stores/pinecone.py b/evadb/third_party/vector_stores/pinecone.py index 837c95e579..3bead1a690 100644 --- a/evadb/third_party/vector_stores/pinecone.py +++ b/evadb/third_party/vector_stores/pinecone.py @@ -15,7 +15,6 @@ import os from typing import List -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.third_party.vector_stores.types import ( FeaturePayload, VectorIndexQuery, @@ -30,34 +29,30 @@ class PineconeVectorStore(VectorStore): - def __init__(self, index_name: str) -> None: + def __init__(self, index_name: str, **kwargs) -> None: try_to_import_pinecone_client() global _pinecone_init_done # pinecone only allows index names with lower alpha-numeric characters and '-' self._index_name = index_name.strip().lower() # Get the API key. - self._api_key = ConfigurationManager().get_value( - "third_party", "PINECONE_API_KEY" - ) + self._api_key = kwargs.get("PINECONE_API_KEY") if not self._api_key: self._api_key = os.environ.get("PINECONE_API_KEY") assert ( self._api_key - ), "Please set your Pinecone API key in evadb.yml file (third_party, pinecone_api_key) or environment variable (PINECONE_KEY). It can be found at Pinecone Dashboard > API Keys > Value" + ), "Please set your `PINECONE_API_KEY` using set command or environment variable (PINECONE_KEY). It can be found at Pinecone Dashboard > API Keys > Value" # Get the environment name. - self._environment = ConfigurationManager().get_value( - "third_party", "PINECONE_ENV" - ) + self._environment = kwargs.get("PINECONE_ENV") if not self._environment: self._environment = os.environ.get("PINECONE_ENV") assert ( self._environment - ), "Please set the Pinecone environment key in evadb.yml file (third_party, pinecone_env) or environment variable (PINECONE_ENV). It can be found Pinecone Dashboard > API Keys > Environment." + ), "Please set your `PINECONE_ENV` or environment variable (PINECONE_ENV). It can be found Pinecone Dashboard > API Keys > Environment." if not _pinecone_init_done: # Initialize pinecone. diff --git a/evadb/third_party/vector_stores/utils.py b/evadb/third_party/vector_stores/utils.py index e47d24f1f9..c7c5cb75b2 100644 --- a/evadb/third_party/vector_stores/utils.py +++ b/evadb/third_party/vector_stores/utils.py @@ -41,6 +41,7 @@ def init_vector_store( from evadb.third_party.vector_stores.pinecone import required_params validate_kwargs(kwargs, required_params, required_params) + return PineconeVectorStore(index_name, **kwargs) elif vector_store_type == VectorStoreType.CHROMADB: diff --git a/test/app_tests/test_pandas_qa.py b/test/app_tests/test_pandas_qa.py index 6976a4699d..e45c927620 100644 --- a/test/app_tests/test_pandas_qa.py +++ b/test/app_tests/test_pandas_qa.py @@ -25,7 +25,9 @@ class PandasQATest(unittest.TestCase): def setUpClass(cls): cls.evadb = get_evadb_for_testing() cls.evadb.catalog().reset() - os.environ["ray"] = str(cls.evadb.config.get_value("experimental", "ray")) + os.environ["ray"] = str( + cls.evadb.catalog().get_configuration_catalog_value("ray") + ) @classmethod def tearDownClass(cls): diff --git a/test/app_tests/test_privategpt.py b/test/app_tests/test_privategpt.py index 8a0b46f340..ff534dec22 100644 --- a/test/app_tests/test_privategpt.py +++ b/test/app_tests/test_privategpt.py @@ -29,7 +29,9 @@ class PrivateGPTTest(unittest.TestCase): def setUpClass(cls): cls.evadb = get_evadb_for_testing() cls.evadb.catalog().reset() - os.environ["ray"] = str(cls.evadb.config.get_value("experimental", "ray")) + os.environ["ray"] = str( + cls.evadb.catalog().get_configuration_catalog_value("ray") + ) @classmethod def tearDownClass(cls): diff --git a/test/app_tests/test_youtube_channel_qa.py b/test/app_tests/test_youtube_channel_qa.py index 099a1c73c4..edb138588d 100644 --- a/test/app_tests/test_youtube_channel_qa.py +++ b/test/app_tests/test_youtube_channel_qa.py @@ -24,7 +24,9 @@ class YoutubeChannelQATest(unittest.TestCase): def setUpClass(cls): cls.evadb = get_evadb_for_testing() cls.evadb.catalog().reset() - os.environ["ray"] = str(cls.evadb.config.get_value("experimental", "ray")) + os.environ["ray"] = str( + cls.evadb.catalog().get_configuration_catalog_value("ray") + ) @classmethod def tearDownClass(cls): @@ -39,7 +41,7 @@ def tearDown(self) -> None: def test_should_run_youtube_channel_qa_app(self): app_path = Path("apps", "youtube_channel_qa", "youtube_channel_qa.py") input1 = "\n\n\n" # Download just one video from the default channel in the default order. - # Assuming that OPENAI_KEY is already set as an environment variable + # Assuming that OPENAI_API_KEY is already set as an environment variable input2 = "What is this video about?\n" # Question input3 = "exit\n" # Exit inputs = input1 + input2 + input3 diff --git a/test/app_tests/test_youtube_qa.py b/test/app_tests/test_youtube_qa.py index 47d062405b..9402654bdf 100644 --- a/test/app_tests/test_youtube_qa.py +++ b/test/app_tests/test_youtube_qa.py @@ -25,7 +25,9 @@ class YoutubeQATest(unittest.TestCase): def setUpClass(cls): cls.evadb = get_evadb_for_testing() cls.evadb.catalog().reset() - os.environ["ray"] = str(cls.evadb.config.get_value("experimental", "ray")) + os.environ["ray"] = str( + cls.evadb.catalog().get_configuration_catalog_value("ray") + ) @classmethod def tearDownClass(cls): @@ -41,7 +43,7 @@ def tearDown(self) -> None: def test_should_run_youtube_qa_app(self): app_path = Path("apps", "youtube_qa", "youtube_qa.py") input1 = "yes\n\n" # Go with online video and default URL - # Assuming that OPENAI_KEY is already set as an environment variable + # Assuming that OPENAI_API_KEY is already set as an environment variable input2 = "What is this video on?\n" # Question input3 = "exit\nexit\n" # Exit inputs = input1 + input2 + input3 diff --git a/test/integration_tests/long/test_create_index_executor.py b/test/integration_tests/long/test_create_index_executor.py index feabb5bff5..f44ef8f823 100644 --- a/test/integration_tests/long/test_create_index_executor.py +++ b/test/integration_tests/long/test_create_index_executor.py @@ -33,7 +33,7 @@ class CreateIndexTest(unittest.TestCase): def _index_save_path(self): return str( - Path(self.evadb.config.get_value("storage", "index_dir")) + Path(self.evadb.catalog().get_configuration_catalog_value("index_dir")) / Path("{}_{}.index".format("FAISS", "testCreateIndexName")) ) diff --git a/test/integration_tests/long/test_error_handling_with_ray.py b/test/integration_tests/long/test_error_handling_with_ray.py index da134b7ed3..c2d71e7fe3 100644 --- a/test/integration_tests/long/test_error_handling_with_ray.py +++ b/test/integration_tests/long/test_error_handling_with_ray.py @@ -32,7 +32,9 @@ class ErrorHandlingRayTests(unittest.TestCase): def setUp(self): self.evadb = get_evadb_for_testing() - os.environ["ray"] = str(self.evadb.config.get_value("experimental", "ray")) + os.environ["ray"] = str( + self.evadb.catalog().get_configuration_catalog_value("ray") + ) self.evadb.catalog().reset() # Load built-in Functions. load_functions_for_testing(self.evadb, mode="debug") diff --git a/test/integration_tests/long/test_explain_executor.py b/test/integration_tests/long/test_explain_executor.py index 9d2c8e8ca5..cad1718c36 100644 --- a/test/integration_tests/long/test_explain_executor.py +++ b/test/integration_tests/long/test_explain_executor.py @@ -57,7 +57,7 @@ def test_explain_simple_select(self): """|__ ProjectPlan\n |__ SeqScanPlan\n |__ StoragePlan\n""" ) self.assertEqual(batch.frames[0][0], expected_output) - rules_manager = RulesManager(self.evadb.config) + rules_manager = RulesManager() with disable_rules(rules_manager, [XformLateralJoinToLinearFlow()]): custom_plan_generator = PlanGenerator(self.evadb, rules_manager) select_query = "EXPLAIN SELECT id, data FROM MyVideo JOIN LATERAL DummyObjectDetector(data) AS T ;" @@ -68,7 +68,7 @@ def test_explain_simple_select(self): self.assertEqual(batch.frames[0][0], expected_output) # Disable more rules - rules_manager = RulesManager(self.evadb.config) + rules_manager = RulesManager() with disable_rules( rules_manager, [ diff --git a/test/integration_tests/long/test_load_executor.py b/test/integration_tests/long/test_load_executor.py index 05a479a8f4..0ca421cf1a 100644 --- a/test/integration_tests/long/test_load_executor.py +++ b/test/integration_tests/long/test_load_executor.py @@ -89,7 +89,9 @@ def test_should_form_symlink_to_individual_video(self): # check that the file is a symlink to self.video_file_path video_file_path = os.path.join(video_dir, video_file) self.assertTrue(os.path.islink(video_file_path)) - self.assertEqual(os.readlink(video_file_path), self.video_file_path) + self.assertEqual( + os.readlink(video_file_path), str(Path(self.video_file_path).resolve()) + ) execute_query_fetch_all(self.evadb, "DROP TABLE IF EXISTS MyVideo;") diff --git a/test/integration_tests/long/test_optimizer_rules.py b/test/integration_tests/long/test_optimizer_rules.py index 27f5189a4b..eb515a19a2 100644 --- a/test/integration_tests/long/test_optimizer_rules.py +++ b/test/integration_tests/long/test_optimizer_rules.py @@ -34,7 +34,6 @@ PushDownFilterThroughApplyAndMerge, PushDownFilterThroughJoin, ReorderPredicates, - XformLateralJoinToLinearFlow, ) from evadb.optimizer.rules.rules_manager import RulesManager, disable_rules from evadb.plan_nodes.predicate_plan import PredicatePlan @@ -88,7 +87,7 @@ def test_should_benefit_from_pushdown(self, merge_mock, evaluate_mock): result_without_pushdown_rules = None with time_without_rule: - rules_manager = RulesManager(self.evadb.config) + rules_manager = RulesManager() with disable_rules( rules_manager, [PushDownFilterThroughApplyAndMerge(), PushDownFilterThroughJoin()], @@ -108,16 +107,6 @@ def test_should_benefit_from_pushdown(self, merge_mock, evaluate_mock): # on all the frames self.assertGreater(evaluate_count_without_rule, 3 * evaluate_count_with_rule) - result_without_xform_rule = None - rules_manager = RulesManager(self.evadb.config) - with disable_rules(rules_manager, [XformLateralJoinToLinearFlow()]): - custom_plan_generator = PlanGenerator(self.evadb, rules_manager) - result_without_xform_rule = execute_query_fetch_all( - self.evadb, query, plan_generator=custom_plan_generator - ) - - self.assertEqual(result_without_xform_rule, result_with_rule) - def test_should_pushdown_without_pushdown_join_rule(self): query = """SELECT id, obj.labels FROM MyVideo JOIN LATERAL @@ -132,7 +121,7 @@ def test_should_pushdown_without_pushdown_join_rule(self): time_without_rule = Timer() result_without_pushdown_join_rule = None with time_without_rule: - rules_manager = RulesManager(self.evadb.config) + rules_manager = RulesManager() with disable_rules(rules_manager, [PushDownFilterThroughJoin()]): # should use PushDownFilterThroughApplyAndMerge() custom_plan_generator = PlanGenerator(self.evadb, rules_manager) @@ -264,7 +253,7 @@ def test_reorder_rule_should_not_have_side_effects(self): query = "SELECT id FROM MyVideo WHERE id < 20 AND id > 10;" result = execute_query_fetch_all(self.evadb, query) - rules_manager = RulesManager(self.evadb.config) + rules_manager = RulesManager() with disable_rules(rules_manager, [ReorderPredicates()]): custom_plan_generator = PlanGenerator(self.evadb, rules_manager) expected = execute_query_fetch_all( diff --git a/test/integration_tests/long/test_pytorch.py b/test/integration_tests/long/test_pytorch.py index f2bd66ba04..b0d1cf6327 100644 --- a/test/integration_tests/long/test_pytorch.py +++ b/test/integration_tests/long/test_pytorch.py @@ -49,7 +49,9 @@ class PytorchTest(unittest.TestCase): def setUpClass(cls): cls.evadb = get_evadb_for_testing() cls.evadb.catalog().reset() - os.environ["ray"] = str(cls.evadb.config.get_value("experimental", "ray")) + os.environ["ray"] = str( + cls.evadb.catalog().get_configuration_catalog_value("ray") + ) ua_detrac = f"{EvaDB_ROOT_DIR}/data/ua_detrac/ua_detrac.mp4" mnist = f"{EvaDB_ROOT_DIR}/data/mnist/mnist.mp4" @@ -295,7 +297,9 @@ def test_should_run_pytorch_and_similarity(self): batch_res = execute_query_fetch_all(self.evadb, select_query) img = batch_res.frames["myvideo.data"][0] - tmp_dir_from_config = self.evadb.config.get_value("storage", "tmp_dir") + tmp_dir_from_config = self.evadb.catalog().get_configuration_catalog_value( + "tmp_dir" + ) img_save_path = os.path.join(tmp_dir_from_config, "dummy.jpg") try: diff --git a/test/integration_tests/long/test_reuse.py b/test/integration_tests/long/test_reuse.py index 3f41e5fbb0..b35751fbd1 100644 --- a/test/integration_tests/long/test_reuse.py +++ b/test/integration_tests/long/test_reuse.py @@ -77,7 +77,7 @@ def _verify_reuse_correctness(self, query, reuse_batch): # surfaces when the system is running on low memory. Explicitly calling garbage # collection to reduce the memory usage. gc.collect() - rules_manager = RulesManager(self.evadb.config) + rules_manager = RulesManager() with disable_rules( rules_manager, [ diff --git a/test/integration_tests/long/test_s3_load_executor.py b/test/integration_tests/long/test_s3_load_executor.py index bdd6487249..e6f961de60 100644 --- a/test/integration_tests/long/test_s3_load_executor.py +++ b/test/integration_tests/long/test_s3_load_executor.py @@ -41,7 +41,9 @@ def setUp(self): self.evadb.catalog().reset() self.video_file_path = create_sample_video() self.multiple_video_file_path = f"{EvaDB_ROOT_DIR}/data/sample_videos/1" - self.s3_download_dir = self.evadb.config.get_value("storage", "s3_download_dir") + self.s3_download_dir = self.evadb.catalog().get_configuration_catalog_value( + "s3_download_dir" + ) """Mocked AWS Credentials for moto.""" os.environ["AWS_ACCESS_KEY_ID"] = "testing" diff --git a/test/integration_tests/long/test_similarity.py b/test/integration_tests/long/test_similarity.py index 8dc7a2e3cc..35f70948f8 100644 --- a/test/integration_tests/long/test_similarity.py +++ b/test/integration_tests/long/test_similarity.py @@ -107,7 +107,7 @@ def setUp(self): # Create an actual image dataset. img_save_path = os.path.join( - self.evadb.config.get_value("storage", "tmp_dir"), + self.evadb.catalog().get_configuration_catalog_value("tmp_dir"), f"test_similar_img{i}.jpg", ) try_to_import_cv2() diff --git a/test/integration_tests/short/test_set_executor.py b/test/integration_tests/short/test_set_executor.py index d732681433..2a92ac2f94 100644 --- a/test/integration_tests/short/test_set_executor.py +++ b/test/integration_tests/short/test_set_executor.py @@ -36,6 +36,8 @@ def tearDownClass(cls): # integration test def test_set_execution(self): execute_query_fetch_all(self.evadb, "SET OPENAIKEY = 'ABCD';") - current_config_value = self.evadb.config.get_value("default", "OPENAIKEY") + current_config_value = self.evadb.catalog().get_configuration_catalog_value( + "OPENAIKEY" + ) self.assertEqual("ABCD", current_config_value) diff --git a/test/unit_tests/catalog/test_catalog_manager.py b/test/unit_tests/catalog/test_catalog_manager.py index 6149be34c9..ef7c382473 100644 --- a/test/unit_tests/catalog/test_catalog_manager.py +++ b/test/unit_tests/catalog/test_catalog_manager.py @@ -44,7 +44,7 @@ def setUpClass(cls) -> None: @mock.patch("evadb.catalog.catalog_manager.init_db") def test_catalog_bootstrap(self, mocked_db): - x = CatalogManager(MagicMock(), MagicMock()) + x = CatalogManager(MagicMock()) x._bootstrap_catalog() mocked_db.assert_called() @@ -52,7 +52,7 @@ def test_catalog_bootstrap(self, mocked_db): "evadb.catalog.catalog_manager.CatalogManager.create_and_insert_table_catalog_entry" ) def test_create_multimedia_table_catalog_entry(self, mock): - x = CatalogManager(MagicMock(), MagicMock()) + x = CatalogManager(MagicMock()) name = "myvideo" x.create_and_insert_multimedia_table_catalog_entry( name=name, format_type=FileFormatType.VIDEO @@ -71,7 +71,7 @@ def test_create_multimedia_table_catalog_entry(self, mock): def test_insert_table_catalog_entry_should_create_table_and_columns( self, ds_mock, initdb_mock ): - catalog = CatalogManager(MagicMock(), MagicMock()) + catalog = CatalogManager(MagicMock()) file_url = "file1" table_name = "name" @@ -88,7 +88,7 @@ def test_insert_table_catalog_entry_should_create_table_and_columns( @mock.patch("evadb.catalog.catalog_manager.init_db") @mock.patch("evadb.catalog.catalog_manager.TableCatalogService") def test_get_table_catalog_entry_when_table_exists(self, ds_mock, initdb_mock): - catalog = CatalogManager(MagicMock(), MagicMock()) + catalog = CatalogManager(MagicMock()) table_name = "name" database_name = "database" row_id = 1 @@ -110,7 +110,7 @@ def test_get_table_catalog_entry_when_table_exists(self, ds_mock, initdb_mock): def test_get_table_catalog_entry_when_table_doesnot_exists( self, dcs_mock, ds_mock, initdb_mock ): - catalog = CatalogManager(MagicMock(), MagicMock()) + catalog = CatalogManager(MagicMock()) table_name = "name" database_name = "database" @@ -132,7 +132,7 @@ def test_get_table_catalog_entry_when_table_doesnot_exists( def test_insert_function( self, checksum_mock, functionmetadata_mock, functionio_mock, function_mock ): - catalog = CatalogManager(MagicMock(), MagicMock()) + catalog = CatalogManager(MagicMock()) function_io_list = [MagicMock()] function_metadata_list = [MagicMock()] actual = catalog.insert_function_catalog_entry( @@ -155,7 +155,7 @@ def test_insert_function( @mock.patch("evadb.catalog.catalog_manager.FunctionCatalogService") def test_get_function_catalog_entry_by_name(self, function_mock): - catalog = CatalogManager(MagicMock(), MagicMock()) + catalog = CatalogManager(MagicMock()) actual = catalog.get_function_catalog_entry_by_name("name") function_mock.return_value.get_entry_by_name.assert_called_with("name") self.assertEqual( @@ -164,25 +164,19 @@ def test_get_function_catalog_entry_by_name(self, function_mock): @mock.patch("evadb.catalog.catalog_manager.FunctionCatalogService") def test_delete_function(self, function_mock): - CatalogManager(MagicMock(), MagicMock()).delete_function_catalog_entry_by_name( - "name" - ) + CatalogManager(MagicMock()).delete_function_catalog_entry_by_name("name") function_mock.return_value.delete_entry_by_name.assert_called_with("name") @mock.patch("evadb.catalog.catalog_manager.FunctionIOCatalogService") def test_get_function_outputs(self, function_mock): mock_func = function_mock.return_value.get_output_entries_by_function_id function_obj = MagicMock(spec=FunctionCatalogEntry) - CatalogManager(MagicMock(), MagicMock()).get_function_io_catalog_output_entries( - function_obj - ) + CatalogManager(MagicMock()).get_function_io_catalog_output_entries(function_obj) mock_func.assert_called_once_with(function_obj.row_id) @mock.patch("evadb.catalog.catalog_manager.FunctionIOCatalogService") def test_get_function_inputs(self, function_mock): mock_func = function_mock.return_value.get_input_entries_by_function_id function_obj = MagicMock(spec=FunctionCatalogEntry) - CatalogManager(MagicMock(), MagicMock()).get_function_io_catalog_input_entries( - function_obj - ) + CatalogManager(MagicMock()).get_function_io_catalog_input_entries(function_obj) mock_func.assert_called_once_with(function_obj.row_id) diff --git a/test/unit_tests/executor/test_execution_context.py b/test/unit_tests/executor/test_execution_context.py index 28383949e9..8d2a4caae3 100644 --- a/test/unit_tests/executor/test_execution_context.py +++ b/test/unit_tests/executor/test_execution_context.py @@ -21,28 +21,24 @@ class ExecutionContextTest(unittest.TestCase): - @patch("evadb.executor.execution_context.ConfigurationManager") @patch("evadb.executor.execution_context.get_gpu_count") @patch("evadb.executor.execution_context.is_gpu_available") def test_CUDA_VISIBLE_DEVICES_gets_populated_from_config( - self, gpu_check, get_gpu_count, cfm + self, gpu_check, get_gpu_count ): gpu_check.return_value = True get_gpu_count.return_value = 3 - cfm.return_value.get_value.return_value = [0, 1] - context = Context() + context = Context([0, 1]) self.assertEqual(context.gpus, [0, 1]) - @patch("evadb.executor.execution_context.ConfigurationManager") @patch("evadb.executor.execution_context.os") @patch("evadb.executor.execution_context.get_gpu_count") @patch("evadb.executor.execution_context.is_gpu_available") def test_CUDA_VISIBLE_DEVICES_gets_populated_from_environment_if_no_config( - self, is_gpu, get_gpu_count, os, cfm + self, is_gpu, get_gpu_count, os ): is_gpu.return_value = True - cfm.return_value.get_value.return_value = [] get_gpu_count.return_value = 3 os.environ.get.return_value = "0,1" context = Context() @@ -50,57 +46,45 @@ def test_CUDA_VISIBLE_DEVICES_gets_populated_from_environment_if_no_config( self.assertEqual(context.gpus, [0, 1]) - @patch("evadb.executor.execution_context.ConfigurationManager") @patch("evadb.executor.execution_context.os") @patch("evadb.executor.execution_context.get_gpu_count") @patch("evadb.executor.execution_context.is_gpu_available") def test_CUDA_VISIBLE_DEVICES_should_be_empty_if_nothing_provided( - self, gpu_check, get_gpu_count, os, cfm + self, gpu_check, get_gpu_count, os ): gpu_check.return_value = True get_gpu_count.return_value = 3 - cfm.return_value.get_value.return_value = [] os.environ.get.return_value = "" context = Context() os.environ.get.assert_called_with("CUDA_VISIBLE_DEVICES", "") self.assertEqual(context.gpus, []) - @patch("evadb.executor.execution_context.ConfigurationManager") @patch("evadb.executor.execution_context.os") @patch("evadb.executor.execution_context.is_gpu_available") - def test_gpus_ignores_config_if_no_gpu_available(self, gpu_check, os, cfm): + def test_gpus_ignores_config_if_no_gpu_available(self, gpu_check, os): gpu_check.return_value = False - cfm.return_value.get_value.return_value = [0, 1, 2] os.environ.get.return_value = "0,1,2" - context = Context() + context = Context([0, 1, 2]) self.assertEqual(context.gpus, []) - @patch("evadb.executor.execution_context.ConfigurationManager") @patch("evadb.executor.execution_context.os") @patch("evadb.executor.execution_context.is_gpu_available") - def test_gpu_device_should_return_NO_GPU_if_GPU_not_available( - self, gpu_check, os, cfm - ): + def test_gpu_device_should_return_NO_GPU_if_GPU_not_available(self, gpu_check, os): gpu_check.return_value = True - cfm.return_value.get_value.return_value = [] os.environ.get.return_value = "" context = Context() os.environ.get.assert_called_with("CUDA_VISIBLE_DEVICES", "") self.assertEqual(context.gpu_device(), NO_GPU) - @patch("evadb.executor.execution_context.ConfigurationManager") @patch("evadb.executor.execution_context.get_gpu_count") @patch("evadb.executor.execution_context.is_gpu_available") - def test_should_return_random_gpu_ID_if_available( - self, gpu_check, get_gpu_count, cfm - ): + def test_should_return_random_gpu_ID_if_available(self, gpu_check, get_gpu_count): gpu_check.return_value = True get_gpu_count.return_value = 1 - cfm.return_value.get_value.return_value = [0, 1, 2] - context = Context() + context = Context([0, 1, 2]) selected_device = context.gpu_device() self.assertEqual(selected_device, 0) diff --git a/test/unit_tests/optimizer/rules/test_batch_mem_size.py b/test/unit_tests/optimizer/rules/test_batch_mem_size.py index 70033b014f..68f84db803 100644 --- a/test/unit_tests/optimizer/rules/test_batch_mem_size.py +++ b/test/unit_tests/optimizer/rules/test_batch_mem_size.py @@ -38,9 +38,7 @@ def test_batch_mem_size_for_sqlite_storage_engine(self): the storage engine. """ test_batch_mem_size = 100 - self.evadb.config.update_value( - "executor", "batch_mem_size", test_batch_mem_size - ) + execute_query_fetch_all(self.evadb, f"SET batch_mem_size={test_batch_mem_size}") create_table_query = """ CREATE TABLE IF NOT EXISTS MyCSV ( id INTEGER UNIQUE, diff --git a/test/unit_tests/optimizer/rules/test_rules.py b/test/unit_tests/optimizer/rules/test_rules.py index e71dbef7cc..18f8dc51d4 100644 --- a/test/unit_tests/optimizer/rules/test_rules.py +++ b/test/unit_tests/optimizer/rules/test_rules.py @@ -168,8 +168,8 @@ def test_supported_rules(self): XformExtractObjectToLinearFlow(), ] rewrite_rules = ( - RulesManager(self.evadb.config).stage_one_rewrite_rules - + RulesManager(self.evadb.config).stage_two_rewrite_rules + RulesManager().stage_one_rewrite_rules + + RulesManager().stage_two_rewrite_rules ) self.assertEqual( len(supported_rewrite_rules), @@ -187,18 +187,15 @@ def test_supported_rules(self): ] self.assertEqual( len(supported_logical_rules), - len(RulesManager(self.evadb.config).logical_rules), + len(RulesManager().logical_rules), ) for rule in supported_logical_rules: self.assertTrue( - any( - isinstance(rule, type(x)) - for x in RulesManager(self.evadb.config).logical_rules - ) + any(isinstance(rule, type(x)) for x in RulesManager().logical_rules) ) - ray_enabled = self.evadb.config.get_value("experimental", "ray") + ray_enabled = self.evadb.catalog().get_configuration_catalog_value("ray") ray_enabled_and_installed = is_ray_enabled_and_installed(ray_enabled) # For the current version, we choose either the distributed or the @@ -244,14 +241,14 @@ def test_supported_rules(self): supported_implementation_rules.append(LogicalExchangeToPhysical()) self.assertEqual( len(supported_implementation_rules), - len(RulesManager(self.evadb.config).implementation_rules), + len(RulesManager().implementation_rules), ) for rule in supported_implementation_rules: self.assertTrue( any( isinstance(rule, type(x)) - for x in RulesManager(self.evadb.config).implementation_rules + for x in RulesManager().implementation_rules ) ) @@ -280,7 +277,7 @@ def test_embed_sample_into_get_does_not_work_with_structured_data(self): self.assertFalse(rule.check(logi_sample, MagicMock())) def test_disable_rules(self): - rules_manager = RulesManager(self.evadb.config) + rules_manager = RulesManager() with disable_rules(rules_manager, [PushDownFilterThroughApplyAndMerge()]): self.assertFalse( any( diff --git a/test/unit_tests/optimizer/test_optimizer_task.py b/test/unit_tests/optimizer/test_optimizer_task.py index 6230dfb164..c9100d6eff 100644 --- a/test/unit_tests/optimizer/test_optimizer_task.py +++ b/test/unit_tests/optimizer/test_optimizer_task.py @@ -51,13 +51,11 @@ def test_abstract_optimizer_task(self): task.execute() def top_down_rewrite(self, opr): - opt_cxt = OptimizerContext(MagicMock(), CostModel(), RulesManager(MagicMock())) + opt_cxt = OptimizerContext(MagicMock(), CostModel(), RulesManager()) grp_expr = opt_cxt.add_opr_to_group(opr) root_grp_id = grp_expr.group_id opt_cxt.task_stack.push( - TopDownRewrite( - grp_expr, RulesManager(MagicMock()).stage_one_rewrite_rules, opt_cxt - ) + TopDownRewrite(grp_expr, RulesManager().stage_one_rewrite_rules, opt_cxt) ) self.execute_task_stack(opt_cxt.task_stack) return opt_cxt, root_grp_id @@ -65,9 +63,7 @@ def top_down_rewrite(self, opr): def bottom_up_rewrite(self, root_grp_id, opt_cxt): grp_expr = opt_cxt.memo.groups[root_grp_id].logical_exprs[0] opt_cxt.task_stack.push( - BottomUpRewrite( - grp_expr, RulesManager(MagicMock()).stage_two_rewrite_rules, opt_cxt - ) + BottomUpRewrite(grp_expr, RulesManager().stage_two_rewrite_rules, opt_cxt) ) self.execute_task_stack(opt_cxt.task_stack) return opt_cxt, root_grp_id diff --git a/test/unit_tests/test_dalle.py b/test/unit_tests/test_dalle.py index a7a9536fa2..c434a4db4a 100644 --- a/test/unit_tests/test_dalle.py +++ b/test/unit_tests/test_dalle.py @@ -41,7 +41,7 @@ def setUp(self) -> None: def tearDown(self) -> None: execute_query_fetch_all(self.evadb, "DROP TABLE IF EXISTS ImageGen;") - @patch.dict("os.environ", {"OPENAI_KEY": "mocked_openai_key"}) + @patch.dict("os.environ", {"OPENAI_API_KEY": "mocked_openai_key"}) @patch("requests.get") @patch("openai.Image.create", return_value={"data": [{"url": "mocked_url"}]}) def test_dalle_image_generation(self, mock_openai_create, mock_requests_get): diff --git a/test/unit_tests/test_eva_cmd_client.py b/test/unit_tests/test_eva_cmd_client.py index 0e1f67ee91..90a7f4a152 100644 --- a/test/unit_tests/test_eva_cmd_client.py +++ b/test/unit_tests/test_eva_cmd_client.py @@ -16,14 +16,13 @@ import asyncio import unittest -import pytest -from mock import call, patch +from mock import patch -from evadb.configuration.configuration_manager import ConfigurationManager from evadb.evadb_cmd_client import evadb_client, main +from evadb.evadb_config import BASE_EVADB_CONFIG -@pytest.mark.skip +# @pytest.mark.skip class CMDClientTest(unittest.TestCase): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -81,17 +80,10 @@ def test_main_without_cmd_arguments( [], ) - # Mock the ConfigurationManager's get_value method - with patch.object( - ConfigurationManager, "get_value", return_value="default_value" - ) as mock_get_value: - # Call the function under test - main() - - # Assert that the mocked functions were called correctly - mock_start_cmd_client.assert_called_once_with( - "default_value", "default_value" - ) - mock_get_value.assert_has_calls( - [call("server", "host"), call("server", "port")] - ) + # Call the function under test + main() + + # Assert that the mocked functions were called correctly + mock_start_cmd_client.assert_called_once_with( + BASE_EVADB_CONFIG["host"], BASE_EVADB_CONFIG["port"] + ) diff --git a/test/util.py b/test/util.py index 23eaeb35e8..3a23a6ff5c 100644 --- a/test/util.py +++ b/test/util.py @@ -30,8 +30,12 @@ from evadb.binder.statement_binder import StatementBinder from evadb.binder.statement_binder_context import StatementBinderContext from evadb.catalog.catalog_type import NdArrayType -from evadb.configuration.configuration_manager import ConfigurationManager -from evadb.configuration.constants import EvaDB_DATABASE_DIR, EvaDB_INSTALLATION_DIR +from evadb.configuration.constants import ( + S3_DOWNLOAD_DIR, + TMP_DIR, + EvaDB_DATABASE_DIR, + EvaDB_INSTALLATION_DIR, +) from evadb.database import init_evadb_instance from evadb.expression.function_expression import FunctionExpression from evadb.functions.abstract.abstract_function import ( @@ -67,7 +71,7 @@ def suffix_pytest_xdist_worker_id_to_dir(path: str): path = Path(str(worker_id) + "_" + path) except KeyError: pass - return path + return Path(path) def get_evadb_for_testing(uri: str = None): @@ -79,14 +83,12 @@ def get_evadb_for_testing(uri: str = None): def get_tmp_dir(): db_dir = suffix_pytest_xdist_worker_id_to_dir(EvaDB_DATABASE_DIR) - config = ConfigurationManager(Path(db_dir)) - return config.get_value("storage", "tmp_dir") + return db_dir / TMP_DIR def s3_dir(): db_dir = suffix_pytest_xdist_worker_id_to_dir(EvaDB_DATABASE_DIR) - config = ConfigurationManager(Path(db_dir)) - return config.get_value("storage", "s3_download_dir") + return db_dir / S3_DOWNLOAD_DIR EvaDB_TEST_DATA_DIR = Path(EvaDB_INSTALLATION_DIR).parent From a6fdd6a68def142ed227236d46845154b93a338c Mon Sep 17 00:00:00 2001 From: Gaurav Tarlok Kakkar Date: Thu, 19 Oct 2023 14:16:50 -0400 Subject: [PATCH 09/64] Fix: minor typo (#1307) --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cb7ad985d9..af2c5ea078 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -234,7 +234,7 @@ jobs: else pip install ".[dev,pinecone,chromadb]" # ray < 2.5.0 does not work with python 3.11 ray-project/ray#33864 fi - python -c "import evadb;cur=evadb.connect().cursor();cur.query('SET ray=True';)" + python -c "import evadb;cur=evadb.connect().cursor();cur.query('SET ray=True;')" else if [ $PY_VERSION != "3.11" ]; then pip install ".[dev,ludwig,qdrant,pinecone,chromadb]" From c637a714c1e68abb5530b20e3ac0d723fe1da3a4 Mon Sep 17 00:00:00 2001 From: K S Lohith <32676813+kslohith@users.noreply.github.com> Date: Fri, 20 Oct 2023 11:10:57 -0400 Subject: [PATCH 10/64] SnowFlake Integration for EvaDB (#1289) Please suggest if this feature needs more test cases --------- Co-authored-by: Lohith K S --- docs/_toc.yml | 1 + docs/source/reference/databases/snowflake.rst | 47 +++++ evadb/third_party/databases/interface.py | 2 + .../databases/snowflake/__init__.py | 15 ++ .../databases/snowflake/requirements.txt | 3 + .../databases/snowflake/snowflake_handler.py | 184 ++++++++++++++++++ .../third_party_tests/test_native_executor.py | 22 +++ .../test_snowflake_native_storage_engine.py | 144 ++++++++++++++ 8 files changed, 418 insertions(+) create mode 100644 docs/source/reference/databases/snowflake.rst create mode 100644 evadb/third_party/databases/snowflake/__init__.py create mode 100644 evadb/third_party/databases/snowflake/requirements.txt create mode 100644 evadb/third_party/databases/snowflake/snowflake_handler.py create mode 100644 test/unit_tests/storage/test_snowflake_native_storage_engine.py diff --git a/docs/_toc.yml b/docs/_toc.yml index 6a37f98261..6739643319 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -71,6 +71,7 @@ parts: - file: source/reference/databases/mariadb - file: source/reference/databases/clickhouse - file: source/reference/databases/github + - file: source/reference/databases/snowflake - file: source/reference/vector_databases/index title: Vector Databases diff --git a/docs/source/reference/databases/snowflake.rst b/docs/source/reference/databases/snowflake.rst new file mode 100644 index 0000000000..239389e186 --- /dev/null +++ b/docs/source/reference/databases/snowflake.rst @@ -0,0 +1,47 @@ +Snowflake +========== + +The connection to Snowflake is based on the `snowflake-connector-python `_ library. + +Dependency +---------- + +* snowflake-connector-python + +Parameters +---------- + +Required: + +* `user` is the database user. +* `password` is the snowflake account password. +* `database` is the database name. +* `warehouse` is the snowflake warehouse name. +* `account` is the snowflake account number ( can be found in the url ). +* `schema` is the schema name. + + +.. warning:: + + Provide the parameters of an already running ``Snowflake`` Data Warehouse. EvaDB only connects to an existing ``Snowflake`` Data Warehouse. + +Create Connection +----------------- + +.. code-block:: text + + CREATE DATABASE snowflake_data WITH ENGINE = 'snowflake', PARAMETERS = { + "user": "", + "password": "" + "account": "", + "database": "EVADB", + "warehouse": "COMPUTE_WH", + "schema": "SAMPLE_DATA" + }; + +.. warning:: + + | In Snowflake Terminology, ``Database`` and ``Schema`` refer to the following. + | A database is a logical grouping of schemas. Each database belongs to a single Snowflake account. + | A schema is a logical grouping of database objects (tables, views, etc.). Each schema belongs to a single database. + diff --git a/evadb/third_party/databases/interface.py b/evadb/third_party/databases/interface.py index 5e30dc8220..e4cd86151c 100644 --- a/evadb/third_party/databases/interface.py +++ b/evadb/third_party/databases/interface.py @@ -44,6 +44,8 @@ def _get_database_handler(engine: str, **kwargs): return mod.MariaDbHandler(engine, **kwargs) elif engine == "clickhouse": return mod.ClickHouseHandler(engine, **kwargs) + elif engine == "snowflake": + return mod.SnowFlakeDbHandler(engine, **kwargs) elif engine == "github": return mod.GithubHandler(engine, **kwargs) else: diff --git a/evadb/third_party/databases/snowflake/__init__.py b/evadb/third_party/databases/snowflake/__init__.py new file mode 100644 index 0000000000..c881047fe1 --- /dev/null +++ b/evadb/third_party/databases/snowflake/__init__.py @@ -0,0 +1,15 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""snowflake integrations""" diff --git a/evadb/third_party/databases/snowflake/requirements.txt b/evadb/third_party/databases/snowflake/requirements.txt new file mode 100644 index 0000000000..c366baf101 --- /dev/null +++ b/evadb/third_party/databases/snowflake/requirements.txt @@ -0,0 +1,3 @@ +snowflake-connector-python +pyarrow +pandas \ No newline at end of file diff --git a/evadb/third_party/databases/snowflake/snowflake_handler.py b/evadb/third_party/databases/snowflake/snowflake_handler.py new file mode 100644 index 0000000000..0b5ba4553d --- /dev/null +++ b/evadb/third_party/databases/snowflake/snowflake_handler.py @@ -0,0 +1,184 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import datetime + +import pandas as pd +import snowflake.connector + +from evadb.third_party.databases.types import ( + DBHandler, + DBHandlerResponse, + DBHandlerStatus, +) + + +class SnowFlakeDbHandler(DBHandler): + + """ + Class for implementing the SnowFlake DB handler as a backend store for + EvaDB. + """ + + def __init__(self, name: str, **kwargs): + """ + Initialize the handler. + Args: + name (str): name of the DB handler instance + **kwargs: arbitrary keyword arguments for establishing the connection. + """ + super().__init__(name) + self.user = kwargs.get("user") + self.password = kwargs.get("password") + self.database = kwargs.get("database") + self.warehouse = kwargs.get("warehouse") + self.account = kwargs.get("account") + self.schema = kwargs.get("schema") + + def connect(self): + """ + Establish connection to the database. + Returns: + DBHandlerStatus + """ + try: + self.connection = snowflake.connector.connect( + user=self.user, + password=self.password, + database=self.database, + warehouse=self.warehouse, + schema=self.schema, + account=self.account, + ) + # Auto commit is off by default. + self.connection.autocommit = True + return DBHandlerStatus(status=True) + except snowflake.connector.errors.Error as e: + return DBHandlerStatus(status=False, error=str(e)) + + def disconnect(self): + """ + Disconnect from the database. + """ + if self.connection: + self.connection.close() + + def check_connection(self) -> DBHandlerStatus: + """ + Method for checking the status of database connection. + Returns: + DBHandlerStatus + """ + if self.connection: + return DBHandlerStatus(status=True) + else: + return DBHandlerStatus(status=False, error="Not connected to the database.") + + def get_tables(self) -> DBHandlerResponse: + """ + Method to get the list of tables from database. + Returns: + DBHandlerStatus + """ + if not self.connection: + return DBHandlerResponse(data=None, error="Not connected to the database.") + + try: + query = f"SELECT table_name as table_name FROM information_schema.tables WHERE table_schema='{self.schema}'" + cursor = self.connection.cursor() + cursor.execute(query) + tables_df = self._fetch_results_as_df(cursor) + return DBHandlerResponse(data=tables_df) + except snowflake.connector.errors.Error as e: + return DBHandlerResponse(data=None, error=str(e)) + + def get_columns(self, table_name: str) -> DBHandlerResponse: + """ + Method to retrieve the columns of the specified table from the database. + Args: + table_name (str): name of the table whose columns are to be retrieved. + Returns: + DBHandlerStatus + """ + if not self.connection: + return DBHandlerResponse(data=None, error="Not connected to the database.") + + try: + query = f"SELECT column_name as name, data_type as dtype FROM information_schema.columns WHERE table_name='{table_name}'" + cursor = self.connection.cursor() + cursor.execute(query) + columns_df = self._fetch_results_as_df(cursor) + columns_df["dtype"] = columns_df["dtype"].apply( + self._snowflake_to_python_types + ) + return DBHandlerResponse(data=columns_df) + except snowflake.connector.errors.Error as e: + return DBHandlerResponse(data=None, error=str(e)) + + def _fetch_results_as_df(self, cursor): + """ + Fetch results from the cursor for the executed query and return the + query results as dataframe. + """ + try: + res = cursor.fetchall() + res_df = pd.DataFrame( + res, columns=[desc[0].lower() for desc in cursor.description] + ) + return res_df + except snowflake.connector.errors.ProgrammingError as e: + if str(e) == "no results to fetch": + return pd.DataFrame({"status": ["success"]}) + raise e + + def execute_native_query(self, query_string: str) -> DBHandlerResponse: + """ + Executes the native query on the database. + Args: + query_string (str): query in native format + Returns: + DBHandlerResponse + """ + if not self.connection: + return DBHandlerResponse(data=None, error="Not connected to the database.") + + try: + cursor = self.connection.cursor() + cursor.execute(query_string) + return DBHandlerResponse(data=self._fetch_results_as_df(cursor)) + except snowflake.connector.errors.Error as e: + return DBHandlerResponse(data=None, error=str(e)) + + def _snowflake_to_python_types(self, snowflake_type: str): + mapping = { + "TEXT": str, + "NUMBER": int, + "INT": int, + "DECIMAL": float, + "STRING": str, + "CHAR": str, + "BOOLEAN": bool, + "BINARY": bytes, + "DATE": datetime.date, + "TIME": datetime.time, + "TIMESTAMP": datetime.datetime + # Add more mappings as needed + } + + if snowflake_type in mapping: + return mapping[snowflake_type] + else: + raise Exception( + f"Unsupported column {snowflake_type} encountered in the snowflake. Please raise a feature request!" + ) diff --git a/test/third_party_tests/test_native_executor.py b/test/third_party_tests/test_native_executor.py index 7eaf27cb85..879435f866 100644 --- a/test/third_party_tests/test_native_executor.py +++ b/test/third_party_tests/test_native_executor.py @@ -228,6 +228,28 @@ def test_should_run_query_in_clickhouse(self): self._execute_native_query() self._execute_evadb_query() + @pytest.mark.skip( + reason="Snowflake does not come with a free version of account, so integration test is not feasible" + ) + def test_should_run_query_in_snowflake(self): + # Create database. + params = { + "user": "eva", + "password": "password", + "account": "account_number", + "database": "EVADB", + "schema": "SAMPLE_DATA", + "warehouse": "warehouse", + } + query = f"""CREATE DATABASE test_data_source + WITH ENGINE = "snowflake", + PARAMETERS = {params};""" + execute_query_fetch_all(self.evadb, query) + + # Test executions. + self._execute_native_query() + self._execute_evadb_query() + def test_should_run_query_in_sqlite(self): # Create database. import os diff --git a/test/unit_tests/storage/test_snowflake_native_storage_engine.py b/test/unit_tests/storage/test_snowflake_native_storage_engine.py new file mode 100644 index 0000000000..50fcea23b3 --- /dev/null +++ b/test/unit_tests/storage/test_snowflake_native_storage_engine.py @@ -0,0 +1,144 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import unittest +from test.util import get_evadb_for_testing +from unittest.mock import MagicMock, patch + +import pytest + +from evadb.catalog.models.utils import DatabaseCatalogEntry +from evadb.server.command_handler import execute_query_fetch_all + +sys.modules["snowflake"] = MagicMock() +sys.modules["snowflake.connector"] = MagicMock() + + +class NativeQueryResponse: + def __init__(self): + self.error = None + self.data = None + + +@pytest.mark.notparallel +class SnowFlakeNativeStorageEngineTest(unittest.TestCase): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def get_snowflake_params(self): + return { + "database": "evadb.db", + } + + def setUp(self): + connection_params = self.get_snowflake_params() + self.evadb = get_evadb_for_testing() + + # Create all class level patches + self.get_database_catalog_entry_patcher = patch( + "evadb.catalog.catalog_manager.CatalogManager.get_database_catalog_entry" + ) + self.get_database_catalog_entry_mock = ( + self.get_database_catalog_entry_patcher.start() + ) + + self.execute_native_query_patcher = patch( + "evadb.third_party.databases.snowflake.snowflake_handler.SnowFlakeDbHandler.execute_native_query" + ) + self.execute_native_query_mock = self.execute_native_query_patcher.start() + + self.connect_patcher = patch( + "evadb.third_party.databases.snowflake.snowflake_handler.SnowFlakeDbHandler.connect" + ) + self.connect_mock = self.connect_patcher.start() + + self.disconnect_patcher = patch( + "evadb.third_party.databases.snowflake.snowflake_handler.SnowFlakeDbHandler.disconnect" + ) + self.disconnect_mock = self.disconnect_patcher.start() + + # set return values + self.execute_native_query_mock.return_value = NativeQueryResponse() + self.get_database_catalog_entry_mock.return_value = DatabaseCatalogEntry( + name="test_data_source", + engine="snowflake", + params=connection_params, + row_id=1, + ) + + def tearDown(self): + self.get_database_catalog_entry_patcher.stop() + self.execute_native_query_patcher.stop() + self.connect_patcher.stop() + self.disconnect_patcher.stop() + + def test_execute_snowflake_select_query(self): + execute_query_fetch_all( + self.evadb, + """USE test_data_source { + SELECT * FROM test_table + }""", + ) + + self.connect_mock.assert_called_once() + self.execute_native_query_mock.assert_called_once() + self.get_database_catalog_entry_mock.assert_called_once() + self.disconnect_mock.assert_called_once() + + def test_execute_snowflake_insert_query(self): + execute_query_fetch_all( + self.evadb, + """USE test_data_source { + INSERT INTO test_table ( + name, age, comment + ) VALUES ( + 'val', 5, 'testing' + ) + }""", + ) + self.connect_mock.assert_called_once() + self.execute_native_query_mock.assert_called_once() + self.get_database_catalog_entry_mock.assert_called_once() + self.disconnect_mock.assert_called_once() + + def test_execute_snowflake_update_query(self): + execute_query_fetch_all( + self.evadb, + """USE test_data_source { + UPDATE test_table + SET comment = 'update' + WHERE age > 5 + }""", + ) + + self.connect_mock.assert_called_once() + self.execute_native_query_mock.assert_called_once() + self.get_database_catalog_entry_mock.assert_called_once() + self.disconnect_mock.assert_called_once() + + def test_execute_snowflake_delete_query(self): + execute_query_fetch_all( + self.evadb, + """USE test_data_source { + DELETE FROM test_table + WHERE age < 5 + }""", + ) + + self.connect_mock.assert_called_once() + self.execute_native_query_mock.assert_called_once() + self.get_database_catalog_entry_mock.assert_called_once() + self.disconnect_mock.assert_called_once() From 0f2d1d4531ccf7548fb9b39d7ecc23126efb2a18 Mon Sep 17 00:00:00 2001 From: Ankith Reddy Chitti Date: Sun, 22 Oct 2023 18:51:55 -0400 Subject: [PATCH 11/64] add documentation --- docs/source/overview/connect-to-data-sources.rst | 8 +++++++- docs/source/reference/evaql.rst | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/source/overview/connect-to-data-sources.rst b/docs/source/overview/connect-to-data-sources.rst index 4651a11e2b..8f7526ae36 100644 --- a/docs/source/overview/connect-to-data-sources.rst +++ b/docs/source/overview/connect-to-data-sources.rst @@ -6,6 +6,12 @@ EvaDB supports a wide range of data sources including SQL database systems, obje Connect to an Existing SQL Database System ------------------------------------------ +.. note:: + + Connecting to an existing SQL database is unnecessary for inserting or querying data in Eva. This step is only required if + users intend to work with data already present in some SQL DB. Eva has native storage support for SQLite, which can be utilized without + establishing any connection. Refer to :ref:`EvaQL` page for more details. + 1. Use the :ref:`CREATE DATABASE` statement to connect to an **existing** SQL database. .. code-block:: @@ -82,6 +88,6 @@ You can use the ``CREATE INDEX`` statement to connect to an existing vector data .. note:: - Go over the :ref:`CREATE INDEX` statement for more details. The :ref:`Vector Databases` page lists all the vector database systems that EvaDB currently supports. + Go over the :ref:`CREATE INDEX` statement for more details. The :ref:`Vector Databases` page lists all the vector database systems that EvaDB currently supports. .. include:: ../shared/designs/design3.rst \ No newline at end of file diff --git a/docs/source/reference/evaql.rst b/docs/source/reference/evaql.rst index 04dda09fd9..d30a4c5318 100644 --- a/docs/source/reference/evaql.rst +++ b/docs/source/reference/evaql.rst @@ -1,3 +1,5 @@ +.. _evaql: + EvaDB Query Language (EvaQL) ============================ From e0264603b69d9267d75c5dfbe62ab5a2fe1dd8cc Mon Sep 17 00:00:00 2001 From: Jineet Desai Date: Wed, 18 Oct 2023 23:52:21 -0400 Subject: [PATCH 12/64] Starting the changes for XGBoost classification integration. --- data/classification/Employee.csv | 4654 +++++++++++++++++ evadb/configuration/constants.py | 1 + evadb/executor/create_function_executor.py | 3 +- .../long/test_model_train.py | 43 +- 4 files changed, 4699 insertions(+), 2 deletions(-) create mode 100644 data/classification/Employee.csv diff --git a/data/classification/Employee.csv b/data/classification/Employee.csv new file mode 100644 index 0000000000..4c5a75240f --- /dev/null +++ b/data/classification/Employee.csv @@ -0,0 +1,4654 @@ +education,joining_year,city,payment_tier,age,gender,ever_benched,experience_in_current_domain,leave_or_not +Bachelors,2017,Bangalore,3,34,Male,No,0,0 +Bachelors,2013,Pune,1,28,Female,No,3,1 +Bachelors,2014,New Delhi,3,38,Female,No,2,0 +Masters,2016,Bangalore,3,27,Male,No,5,1 +Masters,2017,Pune,3,24,Male,Yes,2,1 +Bachelors,2016,Bangalore,3,22,Male,No,0,0 +Bachelors,2015,New Delhi,3,38,Male,No,0,0 +Bachelors,2016,Bangalore,3,34,Female,No,2,1 +Bachelors,2016,Pune,3,23,Male,No,1,0 +Masters,2017,New Delhi,2,37,Male,No,2,0 +Masters,2012,Bangalore,3,27,Male,No,5,1 +Bachelors,2016,Pune,3,34,Male,No,3,0 +Bachelors,2018,Pune,3,32,Male,Yes,5,1 +Bachelors,2016,Bangalore,3,39,Male,No,2,0 +Bachelors,2012,Bangalore,3,37,Male,No,4,0 +Bachelors,2017,Bangalore,1,29,Male,No,3,0 +Bachelors,2014,Bangalore,3,34,Female,No,2,0 +Bachelors,2014,Pune,3,34,Male,No,4,0 +Bachelors,2015,Pune,2,30,Female,No,0,1 +Bachelors,2016,New Delhi,2,22,Female,No,0,1 +Bachelors,2012,Bangalore,3,37,Male,No,0,0 +Masters,2017,New Delhi,2,28,Male,No,4,0 +Bachelors,2017,New Delhi,2,36,Male,No,3,0 +Bachelors,2015,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2017,Bangalore,3,29,Male,No,4,0 +Bachelors,2013,Bangalore,3,22,Female,Yes,0,0 +Bachelors,2016,Bangalore,3,37,Male,No,2,0 +Bachelors,2015,Bangalore,3,23,Male,No,1,0 +Bachelors,2013,Pune,2,31,Female,No,2,1 +Masters,2017,New Delhi,2,30,Female,No,2,0 +PHD,2013,New Delhi,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,23,Male,No,1,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2016,Bangalore,3,40,Male,No,5,0 +Bachelors,2017,Pune,2,37,Female,No,0,1 +Bachelors,2014,Bangalore,1,30,Female,No,3,0 +Bachelors,2012,New Delhi,3,29,Male,No,3,0 +Bachelors,2018,New Delhi,2,34,Female,No,0,1 +Bachelors,2017,Pune,2,29,Female,No,2,1 +Bachelors,2014,Pune,3,30,Male,Yes,4,0 +Bachelors,2015,Bangalore,3,36,Male,No,1,0 +Masters,2017,New Delhi,2,23,Male,No,1,0 +Bachelors,2013,Bangalore,3,30,Male,No,3,1 +Bachelors,2014,Bangalore,3,36,Male,No,0,0 +Bachelors,2015,Pune,3,39,Male,No,4,0 +Bachelors,2014,Bangalore,3,23,Female,No,1,0 +PHD,2012,New Delhi,3,27,Male,No,5,0 +Masters,2013,New Delhi,3,35,Male,No,2,0 +Masters,2017,New Delhi,2,34,Male,No,0,0 +Bachelors,2013,Bangalore,3,30,Female,No,1,0 +PHD,2017,New Delhi,3,34,Male,No,2,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2016,Bangalore,3,34,Female,No,0,0 +Bachelors,2014,Bangalore,3,31,Female,Yes,5,0 +Bachelors,2017,New Delhi,3,31,Female,Yes,5,0 +PHD,2013,New Delhi,3,28,Male,No,2,0 +Bachelors,2016,Bangalore,3,38,Male,No,2,0 +Masters,2014,Pune,3,39,Female,No,2,0 +Bachelors,2013,Pune,3,32,Male,No,4,0 +Masters,2017,Pune,2,36,Male,No,2,1 +Masters,2013,New Delhi,3,29,Male,No,3,0 +Bachelors,2015,Bangalore,3,30,Male,No,5,0 +PHD,2013,Bangalore,2,25,Male,No,3,1 +Bachelors,2014,Pune,1,22,Female,No,0,1 +Bachelors,2016,Bangalore,3,34,Male,No,4,0 +Bachelors,2018,Bangalore,3,40,Male,No,1,1 +PHD,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,New Delhi,3,28,Male,No,0,0 +Bachelors,2015,Bangalore,3,24,Female,No,2,0 +Masters,2017,Bangalore,3,40,Female,No,2,1 +Bachelors,2018,Bangalore,3,23,Female,No,1,1 +Masters,2017,Bangalore,3,31,Male,No,4,0 +Bachelors,2014,Pune,3,25,Female,No,3,0 +Bachelors,2014,Bangalore,1,27,Male,No,5,0 +Masters,2017,New Delhi,2,25,Female,No,3,1 +Bachelors,2015,Bangalore,3,40,Male,No,0,1 +Bachelors,2014,Bangalore,1,23,Female,No,1,0 +Bachelors,2017,Bangalore,3,23,Female,No,1,0 +Bachelors,2012,Bangalore,3,39,Male,No,1,0 +PHD,2015,New Delhi,1,37,Male,No,1,0 +Bachelors,2017,Pune,3,38,Male,No,2,0 +Bachelors,2013,Bangalore,3,31,Female,No,0,1 +Bachelors,2016,Bangalore,3,38,Male,No,5,0 +Bachelors,2017,Bangalore,3,25,Female,No,3,0 +Bachelors,2015,Bangalore,3,27,Female,Yes,5,1 +Bachelors,2016,Pune,2,36,Male,No,0,1 +Bachelors,2017,Pune,2,27,Female,No,5,1 +Masters,2015,Pune,2,32,Female,No,4,0 +Bachelors,2014,Bangalore,3,28,Male,No,4,0 +Masters,2012,New Delhi,3,32,Male,No,2,0 +Bachelors,2018,Bangalore,3,30,Male,No,0,1 +Bachelors,2015,New Delhi,3,22,Male,No,0,0 +Bachelors,2017,New Delhi,2,34,Female,No,5,0 +Masters,2013,New Delhi,3,36,Male,No,2,0 +Bachelors,2014,Bangalore,3,39,Male,No,3,1 +PHD,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2016,Bangalore,3,31,Female,No,0,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,29,Female,No,0,0 +Bachelors,2015,Bangalore,3,24,Female,No,2,1 +Masters,2012,Pune,3,25,Male,No,3,1 +Bachelors,2013,Pune,3,25,Male,No,3,0 +Masters,2017,New Delhi,3,26,Female,No,4,1 +Bachelors,2015,Pune,2,28,Female,Yes,1,1 +Bachelors,2017,New Delhi,3,28,Male,No,2,0 +Masters,2015,Pune,1,28,Female,No,3,1 +Masters,2015,New Delhi,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,28,Male,No,1,0 +Masters,2013,Pune,3,25,Male,No,3,0 +Bachelors,2015,Bangalore,2,25,Female,No,3,1 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Bachelors,2017,Pune,2,27,Female,No,5,1 +Bachelors,2013,Bangalore,3,27,Male,No,5,1 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Masters,2017,New Delhi,2,28,Male,No,2,0 +Bachelors,2014,Pune,1,26,Female,No,4,1 +Bachelors,2015,Bangalore,3,28,Male,No,2,0 +Masters,2013,New Delhi,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,26,Female,No,4,0 +Bachelors,2017,New Delhi,2,25,Male,No,3,0 +Bachelors,2012,Bangalore,1,28,Female,No,3,0 +PHD,2015,New Delhi,3,26,Male,No,4,0 +Bachelors,2015,New Delhi,3,25,Female,No,3,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,1 +Bachelors,2014,Bangalore,3,28,Female,No,3,0 +Masters,2014,Pune,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Male,No,1,0 +Bachelors,2015,Pune,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Masters,2013,Pune,1,24,Male,No,2,1 +Bachelors,2017,Bangalore,3,26,Female,No,4,0 +Bachelors,2013,Bangalore,3,28,Male,No,1,1 +Masters,2016,New Delhi,3,27,Male,No,5,0 +Masters,2017,Bangalore,3,26,Male,No,4,0 +Masters,2017,New Delhi,2,24,Male,No,2,0 +Masters,2018,New Delhi,3,26,Male,No,4,1 +Masters,2017,New Delhi,1,25,Female,No,3,1 +Bachelors,2012,Pune,3,28,Male,No,2,0 +Bachelors,2017,New Delhi,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Masters,2013,New Delhi,3,27,Male,No,5,1 +Bachelors,2017,Pune,2,24,Female,No,2,1 +Bachelors,2017,New Delhi,3,28,Female,No,2,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,27,Female,No,5,0 +Masters,2015,Pune,2,28,Female,No,3,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2016,Pune,3,28,Male,No,1,0 +Masters,2013,Bangalore,1,25,Male,No,3,1 +Bachelors,2015,Pune,3,26,Male,No,4,0 +Bachelors,2018,New Delhi,3,27,Female,No,5,1 +Bachelors,2016,Bangalore,3,24,Male,No,2,1 +Bachelors,2012,Pune,2,24,Female,No,2,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Pune,2,24,Female,No,2,1 +Masters,2012,New Delhi,3,26,Female,No,4,0 +Bachelors,2013,Bangalore,3,28,Female,No,3,0 +Bachelors,2012,Bangalore,3,24,Male,No,2,1 +Bachelors,2015,Bangalore,3,25,Male,No,3,1 +Bachelors,2016,Bangalore,3,28,Male,No,3,0 +Bachelors,2014,Bangalore,3,28,Female,No,3,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2017,New Delhi,3,24,Female,No,2,1 +Bachelors,2016,Bangalore,3,25,Male,No,3,1 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2015,Bangalore,3,28,Male,No,3,0 +Masters,2015,New Delhi,3,26,Male,No,4,1 +Bachelors,2014,New Delhi,3,28,Female,No,1,0 +Bachelors,2015,Pune,3,25,Male,No,3,0 +Masters,2015,Pune,2,28,Female,No,2,0 +Bachelors,2014,Bangalore,3,27,Female,No,5,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,New Delhi,3,24,Female,No,2,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,1 +Masters,2017,New Delhi,3,27,Male,No,5,1 +Bachelors,2015,Pune,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Masters,2017,New Delhi,3,27,Male,No,5,1 +Masters,2017,New Delhi,2,28,Female,No,1,1 +Masters,2017,Pune,2,24,Male,No,2,1 +Masters,2016,New Delhi,3,25,Female,No,3,1 +PHD,2015,New Delhi,3,28,Female,No,1,0 +Bachelors,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2013,Bangalore,2,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,28,Male,No,1,0 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Bachelors,2013,New Delhi,3,25,Female,No,3,0 +Bachelors,2013,Pune,3,28,Male,No,1,0 +Bachelors,2017,Pune,3,24,Male,No,2,0 +Bachelors,2013,New Delhi,3,27,Female,No,5,0 +Bachelors,2015,Bangalore,3,28,Male,Yes,2,0 +Bachelors,2015,Pune,3,28,Male,No,3,0 +Bachelors,2014,Pune,2,25,Female,No,3,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Pune,2,26,Female,No,4,1 +PHD,2013,New Delhi,3,24,Male,No,2,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Masters,2013,Pune,2,27,Male,No,5,1 +Masters,2017,Bangalore,3,28,Male,No,2,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Masters,2017,Pune,2,27,Female,No,5,0 +Masters,2013,Bangalore,2,28,Female,No,2,1 +Masters,2017,Pune,3,28,Male,No,1,1 +Bachelors,2018,Bangalore,3,27,Female,No,5,1 +Bachelors,2014,New Delhi,3,25,Female,No,3,0 +Masters,2017,New Delhi,3,27,Male,No,5,1 +Masters,2013,New Delhi,3,26,Male,No,4,1 +Bachelors,2013,Pune,2,25,Female,No,3,1 +Masters,2012,New Delhi,3,26,Male,No,4,1 +Bachelors,2016,Bangalore,3,25,Male,No,3,1 +Bachelors,2013,Pune,2,26,Male,No,4,0 +Bachelors,2018,Bangalore,3,28,Female,No,2,1 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Pune,1,24,Female,Yes,2,1 +Bachelors,2013,Pune,3,28,Male,No,2,0 +Bachelors,2015,Pune,2,27,Female,Yes,5,1 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Bachelors,2014,Pune,2,27,Female,No,5,1 +Bachelors,2013,Pune,3,24,Male,No,2,0 +Bachelors,2014,Pune,3,24,Male,No,2,0 +PHD,2015,New Delhi,2,25,Female,No,3,0 +Bachelors,2014,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Masters,2015,Pune,2,25,Female,No,3,0 +Bachelors,2015,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,New Delhi,3,24,Female,No,2,0 +Masters,2017,Bangalore,2,26,Female,No,4,1 +Bachelors,2012,New Delhi,3,28,Male,No,1,0 +Masters,2017,Pune,2,26,Female,No,4,0 +Bachelors,2016,Pune,3,25,Male,No,3,0 +Bachelors,2017,New Delhi,3,24,Male,No,2,1 +Bachelors,2013,Pune,2,28,Female,No,3,1 +Bachelors,2014,Bangalore,3,25,Female,No,3,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Pune,2,24,Female,No,2,1 +Bachelors,2015,Bangalore,3,28,Male,No,2,1 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Masters,2015,New Delhi,3,26,Female,No,4,1 +Bachelors,2016,Bangalore,1,28,Female,No,2,0 +Bachelors,2014,Bangalore,3,25,Male,Yes,3,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,28,Male,No,2,0 +Masters,2018,New Delhi,3,24,Female,Yes,2,1 +Bachelors,2017,Pune,2,25,Male,No,3,0 +Bachelors,2018,Pune,2,24,Female,No,2,1 +Masters,2017,New Delhi,2,28,Female,No,1,0 +Bachelors,2013,New Delhi,1,27,Female,No,5,0 +Bachelors,2017,New Delhi,2,27,Female,No,5,0 +Bachelors,2017,Bangalore,3,28,Male,No,1,0 +Bachelors,2016,Pune,2,27,Female,No,5,1 +Masters,2018,Bangalore,3,24,Male,No,2,1 +Bachelors,2012,Pune,1,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Masters,2016,New Delhi,1,27,Male,No,5,0 +Bachelors,2015,New Delhi,3,26,Female,No,4,0 +Bachelors,2012,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2013,Bangalore,3,24,Male,Yes,2,1 +Bachelors,2018,Bangalore,3,26,Female,No,4,1 +Masters,2017,Pune,2,26,Female,No,4,1 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Bachelors,2013,Pune,3,28,Male,No,1,0 +Masters,2013,New Delhi,3,25,Male,No,3,0 +Bachelors,2018,Bangalore,3,28,Female,Yes,1,1 +Bachelors,2013,Pune,3,27,Female,No,5,1 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,28,Male,No,1,0 +Bachelors,2017,New Delhi,3,28,Female,No,3,0 +Masters,2017,New Delhi,2,28,Male,Yes,2,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Masters,2017,New Delhi,3,26,Male,No,4,0 +Bachelors,2015,Pune,1,25,Female,No,3,1 +Masters,2013,New Delhi,3,27,Male,No,5,0 +PHD,2014,Bangalore,3,24,Female,No,2,0 +Masters,2017,New Delhi,2,27,Female,No,5,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Masters,2015,Pune,3,27,Female,No,5,1 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Masters,2017,New Delhi,2,25,Female,No,3,0 +Bachelors,2017,New Delhi,2,28,Male,No,1,0 +Bachelors,2012,New Delhi,3,27,Female,No,5,0 +Masters,2013,New Delhi,3,26,Male,No,4,1 +Bachelors,2015,Bangalore,3,26,Female,Yes,4,1 +Bachelors,2014,Pune,3,28,Male,No,2,0 +Bachelors,2016,Bangalore,3,24,Female,No,2,1 +Bachelors,2012,Bangalore,3,28,Male,No,3,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,New Delhi,3,28,Female,No,1,0 +Bachelors,2014,New Delhi,3,27,Female,Yes,5,0 +Bachelors,2015,Pune,3,26,Female,Yes,4,1 +Masters,2014,New Delhi,3,26,Male,No,4,1 +PHD,2015,New Delhi,3,25,Female,No,3,0 +Masters,2015,New Delhi,3,25,Male,No,3,0 +Bachelors,2012,Pune,3,27,Male,No,5,0 +Masters,2017,New Delhi,2,24,Female,No,2,0 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Masters,2015,Pune,3,28,Female,No,2,0 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Bachelors,2017,Pune,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,1,25,Male,No,3,0 +Masters,2015,Pune,3,28,Female,No,2,0 +Bachelors,2017,Pune,3,26,Male,No,4,0 +Bachelors,2014,Pune,3,24,Male,No,2,0 +Bachelors,2014,Pune,3,25,Female,No,3,1 +Bachelors,2018,Pune,3,26,Female,No,4,1 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,28,Female,No,2,0 +Bachelors,2012,Pune,3,28,Male,No,2,0 +Masters,2012,New Delhi,3,24,Female,No,2,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,New Delhi,3,26,Female,Yes,4,0 +Bachelors,2017,Bangalore,3,28,Male,No,1,0 +Bachelors,2018,Pune,3,25,Male,Yes,3,1 +Masters,2017,New Delhi,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Male,No,2,1 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Masters,2017,New Delhi,2,25,Female,No,3,1 +Bachelors,2013,Pune,2,28,Female,No,1,1 +Bachelors,2015,Bangalore,3,24,Female,No,2,0 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Bachelors,2015,New Delhi,2,27,Female,No,5,1 +Bachelors,2018,Bangalore,3,24,Female,No,2,1 +Bachelors,2013,Bangalore,3,27,Female,No,5,0 +Bachelors,2013,Bangalore,3,24,Male,Yes,2,0 +Bachelors,2013,Bangalore,3,24,Female,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,26,Female,No,4,0 +Bachelors,2015,Bangalore,3,24,Female,No,2,0 +Bachelors,2012,Pune,3,24,Female,No,2,1 +Bachelors,2016,Bangalore,3,24,Male,Yes,2,1 +Bachelors,2012,Bangalore,3,28,Male,No,3,0 +Bachelors,2017,New Delhi,2,27,Male,No,5,0 +Bachelors,2012,Pune,2,27,Female,No,5,1 +Masters,2017,Pune,2,27,Male,No,5,0 +Bachelors,2017,Pune,2,24,Male,No,2,1 +Bachelors,2016,Pune,1,26,Female,No,4,1 +Bachelors,2015,Pune,3,26,Female,No,4,1 +Bachelors,2016,Bangalore,3,25,Male,No,3,1 +Bachelors,2012,Pune,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,28,Male,No,2,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,25,Female,Yes,3,0 +Masters,2017,Pune,2,26,Male,No,4,0 +Masters,2017,Pune,3,28,Male,No,1,1 +Masters,2015,Pune,2,25,Female,No,3,1 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,3,27,Female,No,5,0 +Bachelors,2015,New Delhi,3,24,Female,No,2,0 +Masters,2017,Bangalore,1,26,Female,No,4,1 +Bachelors,2017,New Delhi,1,28,Female,No,2,0 +Bachelors,2015,Bangalore,3,24,Male,No,2,0 +Masters,2015,Pune,2,25,Female,No,3,1 +Bachelors,2014,Bangalore,3,25,Female,No,3,0 +Bachelors,2014,Bangalore,3,28,Male,No,2,0 +Bachelors,2017,Bangalore,3,28,Male,No,3,0 +Masters,2015,New Delhi,1,27,Male,No,5,0 +Bachelors,2014,Pune,1,26,Female,No,4,1 +Masters,2018,Bangalore,3,25,Male,Yes,3,1 +Bachelors,2016,Bangalore,3,28,Female,No,3,0 +Bachelors,2018,New Delhi,3,26,Female,Yes,4,1 +Bachelors,2015,Pune,2,24,Female,No,2,1 +Bachelors,2017,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,28,Male,No,2,0 +Bachelors,2015,Pune,2,25,Female,No,3,1 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,28,Male,No,3,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,26,Female,Yes,4,1 +Bachelors,2015,Pune,3,28,Male,No,2,0 +Bachelors,2014,New Delhi,2,24,Female,No,2,1 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2018,Bangalore,3,28,Male,Yes,3,1 +Bachelors,2015,Pune,3,27,Male,No,5,0 +Bachelors,2014,Pune,2,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,1 +PHD,2013,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,New Delhi,2,28,Female,No,1,0 +Bachelors,2015,Pune,1,26,Female,No,4,1 +Masters,2017,New Delhi,3,26,Male,Yes,4,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,New Delhi,3,24,Female,No,2,0 +Bachelors,2017,New Delhi,2,24,Male,No,2,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Bachelors,2015,Bangalore,3,24,Male,No,2,0 +Masters,2014,Pune,3,25,Male,No,3,0 +Bachelors,2015,Bangalore,3,28,Male,No,2,0 +Bachelors,2016,Pune,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,26,Female,No,4,0 +Bachelors,2015,Pune,2,25,Female,Yes,3,1 +Masters,2013,New Delhi,2,25,Male,No,3,1 +Bachelors,2017,Pune,3,25,Male,No,3,0 +Bachelors,2015,Pune,2,26,Female,Yes,4,1 +Masters,2015,Bangalore,2,26,Female,No,4,1 +Bachelors,2012,Pune,3,27,Female,No,5,0 +Masters,2017,New Delhi,3,28,Male,Yes,2,0 +Bachelors,2016,Pune,3,25,Male,No,3,0 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,Pune,3,28,Male,No,1,0 +Bachelors,2013,New Delhi,3,27,Female,Yes,5,0 +Bachelors,2015,New Delhi,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Pune,2,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +PHD,2018,New Delhi,3,25,Male,No,3,1 +Bachelors,2014,Pune,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2017,Pune,2,24,Female,No,2,1 +PHD,2016,New Delhi,2,28,Male,No,3,1 +Masters,2014,New Delhi,3,26,Male,No,4,1 +Masters,2017,New Delhi,2,27,Male,Yes,5,1 +PHD,2013,New Delhi,3,27,Male,No,5,0 +Masters,2014,New Delhi,3,28,Female,No,1,0 +Bachelors,2017,Pune,3,27,Male,No,5,0 +Bachelors,2015,Pune,3,26,Female,Yes,4,1 +Masters,2014,Bangalore,3,26,Male,No,4,1 +Masters,2012,Pune,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Masters,2017,Pune,2,27,Male,No,5,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,1 +Bachelors,2016,Pune,3,27,Male,Yes,5,0 +Bachelors,2014,Pune,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,28,Male,No,1,0 +Masters,2012,Pune,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,25,Male,Yes,3,0 +Bachelors,2013,Pune,2,25,Male,No,3,1 +Bachelors,2012,Pune,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,25,Female,No,3,0 +Bachelors,2015,New Delhi,3,25,Male,No,3,0 +PHD,2012,Pune,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Masters,2015,New Delhi,3,24,Female,No,2,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Pune,3,24,Male,No,2,0 +Masters,2017,New Delhi,3,24,Male,No,2,1 +Bachelors,2014,Bangalore,1,25,Male,Yes,3,0 +Bachelors,2018,Bangalore,3,28,Male,No,1,1 +Bachelors,2017,Bangalore,3,28,Male,Yes,3,0 +Masters,2013,Bangalore,3,28,Female,Yes,2,1 +Bachelors,2013,Bangalore,3,26,Male,Yes,4,0 +Masters,2018,New Delhi,1,24,Male,Yes,2,1 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +PHD,2013,New Delhi,2,27,Female,No,5,0 +Masters,2018,New Delhi,3,28,Male,Yes,2,1 +Bachelors,2014,Bangalore,3,28,Male,No,3,1 +Bachelors,2014,Pune,3,27,Male,No,5,0 +Bachelors,2013,New Delhi,3,24,Female,No,2,1 +Bachelors,2015,Pune,2,28,Female,No,1,1 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2017,New Delhi,2,28,Female,No,3,0 +Masters,2012,Pune,3,27,Female,No,5,1 +Masters,2017,Pune,3,25,Female,Yes,3,1 +Masters,2013,New Delhi,2,25,Male,No,3,1 +Masters,2017,New Delhi,2,27,Male,No,5,1 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,Pune,2,24,Female,No,2,1 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Bachelors,2012,Bangalore,3,24,Male,No,2,1 +Masters,2017,Pune,2,24,Male,No,2,0 +Bachelors,2015,Pune,2,25,Female,Yes,3,1 +Bachelors,2015,New Delhi,3,26,Female,Yes,4,0 +Bachelors,2013,Pune,2,24,Male,Yes,2,1 +Bachelors,2013,Pune,3,25,Male,No,3,0 +PHD,2015,New Delhi,2,28,Female,No,1,0 +Bachelors,2016,Pune,3,24,Male,No,2,0 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,25,Female,No,3,0 +Masters,2014,New Delhi,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,28,Female,No,3,0 +Bachelors,2018,Pune,3,25,Male,No,3,1 +Bachelors,2013,Bangalore,3,26,Male,Yes,4,1 +Bachelors,2015,New Delhi,3,25,Male,No,3,1 +Bachelors,2017,New Delhi,2,25,Female,No,3,1 +Bachelors,2012,Bangalore,3,25,Male,Yes,3,0 +Bachelors,2014,New Delhi,3,28,Female,No,2,0 +Bachelors,2017,New Delhi,2,27,Female,No,5,0 +Bachelors,2018,Pune,3,26,Male,No,4,1 +Masters,2014,New Delhi,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,1 +Masters,2017,Pune,3,25,Male,No,3,1 +Bachelors,2018,Bangalore,3,28,Male,No,2,1 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,24,Male,Yes,2,0 +Bachelors,2015,Bangalore,3,28,Female,No,1,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2016,New Delhi,3,24,Female,No,2,0 +Bachelors,2012,Bangalore,3,25,Female,No,3,0 +Bachelors,2012,Pune,3,28,Male,No,3,0 +Bachelors,2018,Pune,3,25,Male,Yes,3,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,1 +Bachelors,2016,Bangalore,3,27,Female,No,5,0 +Masters,2015,Pune,2,24,Female,No,2,0 +Masters,2014,Bangalore,3,24,Female,No,2,1 +Bachelors,2013,Bangalore,3,25,Male,No,3,0 +Masters,2017,New Delhi,3,24,Male,No,2,0 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,New Delhi,2,28,Male,No,3,0 +Bachelors,2016,Bangalore,3,28,Male,No,2,0 +PHD,2014,New Delhi,3,24,Male,No,2,0 +Masters,2017,New Delhi,2,26,Female,No,4,0 +Masters,2018,New Delhi,3,25,Male,No,3,1 +Bachelors,2014,Bangalore,3,28,Male,No,3,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,1 +Bachelors,2018,New Delhi,3,28,Female,No,3,1 +Masters,2017,New Delhi,2,25,Male,Yes,3,1 +Masters,2013,New Delhi,3,28,Male,No,2,0 +Bachelors,2014,Bangalore,3,26,Male,Yes,4,0 +Masters,2017,New Delhi,2,25,Female,No,3,1 +Masters,2013,New Delhi,3,25,Female,No,3,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,0 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Masters,2017,New Delhi,2,26,Male,Yes,4,1 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Male,No,2,0 +Masters,2015,Pune,3,28,Female,Yes,2,0 +Bachelors,2015,Pune,2,27,Female,Yes,5,1 +Masters,2014,Pune,2,27,Female,No,5,0 +Bachelors,2017,New Delhi,2,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Masters,2015,Pune,1,27,Female,No,5,0 +Bachelors,2013,Bangalore,1,28,Male,No,3,1 +Bachelors,2012,Pune,2,26,Female,No,4,1 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Masters,2017,New Delhi,2,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,New Delhi,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,28,Female,No,1,1 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2015,Pune,2,28,Female,No,3,1 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Bachelors,2016,Bangalore,3,27,Female,No,5,1 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Masters,2018,Pune,3,25,Male,No,3,1 +Bachelors,2015,Pune,3,26,Male,No,4,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +PHD,2017,New Delhi,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,New Delhi,3,28,Female,No,2,0 +Bachelors,2014,Pune,3,25,Female,No,3,0 +Bachelors,2013,Bangalore,3,28,Male,Yes,3,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Pune,2,25,Female,No,3,1 +Bachelors,2017,Pune,2,26,Female,No,4,1 +Bachelors,2015,Pune,3,28,Male,No,3,0 +Masters,2017,Pune,2,26,Male,No,4,1 +Masters,2015,New Delhi,3,28,Female,Yes,2,0 +Bachelors,2012,New Delhi,2,25,Male,No,3,1 +Bachelors,2016,Bangalore,3,25,Female,No,3,0 +Masters,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,1 +PHD,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Masters,2012,Pune,2,26,Female,No,4,0 +Masters,2016,New Delhi,3,27,Male,No,5,1 +PHD,2017,Bangalore,3,28,Male,No,1,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Pune,3,26,Male,No,4,1 +Bachelors,2018,Bangalore,1,27,Male,No,5,0 +Bachelors,2016,Pune,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,28,Male,No,2,0 +Bachelors,2017,New Delhi,2,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,25,Male,No,3,0 +Bachelors,2013,Bangalore,3,28,Male,No,1,0 +Bachelors,2018,Bangalore,3,28,Female,No,3,1 +Bachelors,2016,Bangalore,3,27,Male,Yes,5,0 +Masters,2015,Pune,2,28,Female,No,3,0 +Masters,2015,New Delhi,3,24,Female,No,2,1 +Bachelors,2017,New Delhi,3,24,Male,No,2,0 +Bachelors,2015,Pune,2,24,Female,No,2,1 +Masters,2013,Pune,3,28,Male,No,2,1 +Bachelors,2017,Pune,3,27,Female,No,5,1 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Pune,1,26,Female,No,4,1 +Bachelors,2015,Pune,3,28,Male,No,3,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,New Delhi,2,26,Male,No,4,0 +Masters,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,1 +Bachelors,2013,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2014,Bangalore,3,28,Male,No,3,1 +Bachelors,2014,New Delhi,3,28,Female,No,3,0 +Bachelors,2014,Pune,3,25,Female,No,3,1 +Bachelors,2016,Pune,3,28,Male,No,3,0 +Masters,2017,Bangalore,3,27,Male,No,5,1 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Pune,3,27,Male,No,5,0 +Bachelors,2012,Pune,3,28,Male,No,3,0 +Masters,2017,Pune,3,26,Male,No,4,1 +Bachelors,2013,Bangalore,3,25,Male,Yes,3,0 +Bachelors,2015,Pune,2,28,Female,No,2,1 +PHD,2013,Bangalore,1,26,Male,No,4,0 +Masters,2012,Pune,3,27,Male,No,5,1 +Bachelors,2016,Bangalore,1,28,Male,No,2,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Masters,2017,New Delhi,2,24,Female,Yes,2,1 +Bachelors,2015,Bangalore,1,25,Female,Yes,3,0 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2015,Pune,2,24,Female,No,2,1 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2016,Bangalore,3,27,Female,No,5,0 +Masters,2016,New Delhi,3,25,Female,No,3,1 +Masters,2018,New Delhi,3,26,Male,No,4,1 +Bachelors,2018,Bangalore,3,24,Female,No,2,1 +Bachelors,2017,New Delhi,2,28,Male,No,3,0 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,0 +Bachelors,2013,Pune,3,25,Male,No,3,0 +Bachelors,2015,Pune,3,25,Female,No,3,1 +Bachelors,2014,Bangalore,3,28,Female,No,3,0 +Bachelors,2015,Pune,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,26,Female,No,4,0 +Bachelors,2018,Bangalore,1,25,Male,Yes,3,0 +Masters,2017,Pune,2,28,Female,No,1,0 +Bachelors,2014,Pune,2,25,Female,No,3,1 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2016,Bangalore,3,28,Female,No,3,0 +Bachelors,2014,Bangalore,3,28,Female,No,2,0 +Masters,2017,New Delhi,2,28,Male,No,2,0 +Bachelors,2017,New Delhi,2,24,Female,No,2,0 +PHD,2013,New Delhi,2,25,Male,No,3,1 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,Bangalore,3,26,Female,No,4,0 +Bachelors,2015,Bangalore,1,25,Male,No,3,0 +Bachelors,2016,Bangalore,3,26,Female,No,4,0 +PHD,2014,New Delhi,3,28,Male,No,2,1 +Masters,2018,New Delhi,3,27,Female,No,5,1 +Bachelors,2016,New Delhi,3,27,Female,No,5,0 +Masters,2017,New Delhi,2,25,Male,No,3,1 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,New Delhi,3,27,Female,Yes,5,0 +Bachelors,2017,Pune,2,25,Female,No,3,1 +Bachelors,2018,Pune,3,28,Female,No,1,1 +Bachelors,2014,Bangalore,3,25,Female,No,3,1 +Bachelors,2018,Pune,3,28,Male,No,1,1 +Bachelors,2017,Bangalore,1,26,Female,No,4,0 +Bachelors,2013,Bangalore,3,24,Male,No,2,1 +Bachelors,2012,New Delhi,3,26,Female,No,4,0 +Bachelors,2012,Pune,3,25,Male,No,3,0 +Masters,2013,New Delhi,2,24,Male,No,2,1 +Bachelors,2018,Pune,3,26,Male,No,4,1 +Bachelors,2016,New Delhi,3,28,Female,No,2,0 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Masters,2014,New Delhi,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Pune,2,26,Female,No,4,1 +Bachelors,2014,Pune,3,25,Male,No,3,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2015,Bangalore,3,25,Female,No,3,1 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Masters,2017,Pune,2,26,Female,No,4,0 +Bachelors,2017,New Delhi,3,27,Female,Yes,5,0 +Masters,2017,Pune,1,24,Male,No,2,0 +Masters,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2015,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Masters,2017,Pune,2,24,Male,No,2,1 +Bachelors,2017,Bangalore,3,26,Female,No,4,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,28,Male,Yes,1,1 +Masters,2017,New Delhi,2,24,Male,No,2,0 +Bachelors,2013,Pune,2,25,Female,No,3,1 +Masters,2013,Bangalore,3,27,Male,No,5,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,New Delhi,2,28,Female,Yes,2,1 +Bachelors,2014,Pune,2,24,Female,No,2,1 +Bachelors,2016,Pune,2,27,Female,No,5,1 +Bachelors,2017,Bangalore,3,27,Female,No,5,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2018,Bangalore,3,27,Male,Yes,5,1 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,New Delhi,2,24,Female,No,2,1 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Bachelors,2015,Pune,2,28,Female,Yes,2,1 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2016,Bangalore,3,24,Female,No,2,0 +Masters,2017,Pune,3,24,Male,No,2,1 +Masters,2016,Pune,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Male,Yes,1,1 +Bachelors,2015,Bangalore,1,28,Female,No,1,0 +PHD,2018,Bangalore,3,24,Female,No,2,1 +Bachelors,2016,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,25,Male,No,3,1 +Masters,2016,New Delhi,3,24,Male,No,2,1 +Bachelors,2017,New Delhi,1,25,Female,No,3,0 +Bachelors,2013,Bangalore,3,28,Male,No,3,0 +Bachelors,2018,Bangalore,3,28,Male,No,1,1 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Masters,2014,New Delhi,3,24,Male,No,2,1 +PHD,2012,New Delhi,3,24,Male,No,2,0 +Bachelors,2017,Bangalore,3,25,Female,No,3,0 +Masters,2014,New Delhi,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Bachelors,2014,Pune,3,25,Male,No,3,1 +Bachelors,2012,Bangalore,3,28,Male,No,3,0 +Bachelors,2012,Bangalore,3,25,Female,No,3,0 +Bachelors,2015,Bangalore,3,24,Female,No,2,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Bachelors,2012,Pune,2,26,Male,No,4,0 +Masters,2017,Bangalore,3,28,Female,No,3,1 +Bachelors,2015,Bangalore,3,25,Male,No,3,1 +Bachelors,2012,Bangalore,3,28,Female,No,2,0 +Bachelors,2017,Pune,2,26,Female,No,4,1 +Bachelors,2012,Bangalore,3,27,Female,No,5,0 +Masters,2016,New Delhi,3,28,Male,No,1,0 +Bachelors,2015,Pune,2,28,Female,No,1,1 +Masters,2017,Pune,3,24,Male,No,2,1 +Bachelors,2015,Pune,2,25,Female,No,3,1 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,28,Male,No,3,0 +Bachelors,2016,New Delhi,3,25,Female,Yes,3,0 +Masters,2015,New Delhi,3,26,Male,No,4,1 +Masters,2015,New Delhi,3,28,Female,No,3,0 +Bachelors,2013,New Delhi,1,24,Female,No,2,1 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,New Delhi,3,25,Female,No,3,1 +Bachelors,2017,New Delhi,3,28,Male,No,2,0 +Bachelors,2016,Pune,1,25,Female,No,3,1 +Masters,2013,New Delhi,3,25,Male,Yes,3,1 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Masters,2013,New Delhi,3,25,Female,No,3,1 +Bachelors,2013,Bangalore,1,28,Female,No,2,0 +Masters,2014,Bangalore,3,27,Female,No,5,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,0 +Bachelors,2015,Pune,2,26,Female,Yes,4,1 +Bachelors,2017,New Delhi,3,25,Male,No,3,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Pune,2,27,Male,Yes,5,0 +Bachelors,2015,Pune,2,25,Female,No,3,1 +Bachelors,2016,Bangalore,3,25,Male,Yes,3,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,1 +Bachelors,2016,Pune,3,28,Male,No,1,0 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Masters,2015,Pune,3,28,Female,No,3,0 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Masters,2017,Pune,2,26,Male,No,4,1 +Bachelors,2017,New Delhi,2,27,Female,No,5,0 +Bachelors,2013,Pune,2,26,Female,No,4,1 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,New Delhi,3,28,Female,Yes,3,0 +Masters,2015,Pune,2,24,Female,No,2,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,0 +Masters,2017,New Delhi,2,25,Male,No,3,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2012,Pune,2,25,Male,No,3,1 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,Bangalore,3,27,Female,No,5,1 +Bachelors,2017,New Delhi,3,27,Female,No,5,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2015,Pune,2,24,Female,Yes,2,1 +Bachelors,2017,Bangalore,3,24,Female,Yes,2,0 +PHD,2015,New Delhi,3,28,Female,No,1,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Bachelors,2017,New Delhi,2,25,Female,No,3,0 +Bachelors,2014,Pune,2,25,Female,No,3,1 +Bachelors,2016,New Delhi,3,28,Female,Yes,3,0 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Masters,2017,Pune,2,25,Male,No,3,1 +Masters,2017,Bangalore,2,25,Female,Yes,3,1 +Bachelors,2017,Bangalore,3,24,Female,No,2,1 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Bachelors,2018,Bangalore,3,24,Male,Yes,2,1 +Bachelors,2016,New Delhi,3,28,Male,No,1,0 +Masters,2017,New Delhi,2,24,Male,No,2,1 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,1 +Masters,2014,New Delhi,3,25,Female,No,3,1 +Bachelors,2012,Bangalore,3,27,Female,No,5,0 +Bachelors,2012,New Delhi,3,27,Female,No,5,0 +Bachelors,2017,Bangalore,3,28,Male,No,2,1 +Bachelors,2012,Bangalore,3,28,Male,Yes,3,1 +Bachelors,2012,Pune,3,28,Female,No,2,0 +Bachelors,2018,Bangalore,3,24,Female,No,2,1 +PHD,2016,New Delhi,3,24,Female,No,2,0 +Masters,2017,New Delhi,2,27,Female,No,5,1 +Masters,2013,New Delhi,2,27,Female,No,5,1 +Bachelors,2015,Bangalore,3,26,Female,No,4,0 +Masters,2015,New Delhi,3,28,Female,No,1,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,New Delhi,3,25,Female,No,3,0 +Bachelors,2015,Bangalore,3,26,Female,No,4,1 +Bachelors,2012,Pune,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Masters,2015,Pune,2,25,Female,No,3,1 +Bachelors,2013,New Delhi,3,24,Male,No,2,0 +Masters,2017,New Delhi,2,27,Female,No,5,0 +Masters,2017,Pune,2,26,Male,No,4,0 +Bachelors,2014,Pune,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Bachelors,2014,Bangalore,3,25,Female,No,3,0 +Bachelors,2013,Pune,2,27,Female,No,5,1 +Bachelors,2015,Pune,3,26,Male,No,4,0 +Bachelors,2017,Pune,2,24,Male,No,2,1 +Masters,2017,New Delhi,2,26,Male,No,4,1 +Bachelors,2013,Pune,2,25,Male,Yes,3,1 +Masters,2017,New Delhi,2,25,Female,No,3,1 +Bachelors,2013,Pune,3,26,Female,Yes,4,0 +Bachelors,2014,Pune,3,28,Male,No,2,0 +Bachelors,2016,New Delhi,3,27,Female,No,5,0 +Bachelors,2017,New Delhi,2,28,Male,No,1,0 +Masters,2014,New Delhi,3,27,Male,No,5,0 +Bachelors,2014,New Delhi,3,28,Female,No,1,0 +Bachelors,2015,Bangalore,3,27,Male,No,5,1 +Bachelors,2015,Bangalore,3,24,Male,No,2,1 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,28,Female,No,2,0 +Masters,2017,Pune,2,26,Male,No,4,0 +Masters,2017,New Delhi,2,25,Male,No,3,1 +Bachelors,2016,New Delhi,3,27,Female,No,5,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Pune,3,25,Male,No,3,0 +Bachelors,2012,New Delhi,3,26,Female,Yes,4,0 +Masters,2014,Bangalore,3,27,Male,No,5,1 +Masters,2017,New Delhi,2,26,Male,No,4,0 +Masters,2012,New Delhi,3,26,Male,No,4,1 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Masters,2014,New Delhi,3,25,Male,No,3,0 +Bachelors,2015,Bangalore,3,28,Male,Yes,2,0 +Masters,2012,Pune,3,27,Male,No,5,1 +Bachelors,2017,Bangalore,2,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,1 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Bachelors,2017,Bangalore,3,28,Male,No,1,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,1 +Bachelors,2018,Bangalore,3,28,Female,No,3,1 +Bachelors,2014,New Delhi,3,24,Female,No,2,0 +Bachelors,2017,Bangalore,1,27,Male,No,5,0 +Bachelors,2015,New Delhi,3,24,Female,No,2,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Pune,3,28,Male,No,3,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,25,Female,No,3,0 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Bachelors,2013,Bangalore,3,28,Female,No,3,0 +Bachelors,2017,New Delhi,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Masters,2017,New Delhi,2,26,Female,No,4,1 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,Pune,3,27,Male,No,5,0 +Bachelors,2012,Pune,3,27,Male,No,5,0 +Bachelors,2017,Pune,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,28,Male,No,3,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Masters,2017,Bangalore,3,28,Male,No,1,1 +Bachelors,2018,Bangalore,3,27,Male,Yes,5,1 +Bachelors,2017,Bangalore,3,28,Male,Yes,1,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,0 +Bachelors,2013,Pune,3,24,Female,No,2,0 +Bachelors,2018,New Delhi,3,25,Female,No,3,1 +Bachelors,2014,Bangalore,3,24,Female,No,2,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Masters,2013,New Delhi,1,24,Female,No,2,0 +Masters,2013,New Delhi,1,24,Male,Yes,2,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,2,25,Male,No,3,0 +Bachelors,2015,Bangalore,3,28,Female,No,1,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +PHD,2018,New Delhi,3,24,Female,No,2,1 +Bachelors,2015,Pune,3,28,Male,No,1,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +PHD,2015,Pune,2,28,Female,No,1,0 +Bachelors,2018,Bangalore,3,25,Male,Yes,3,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,27,Female,No,5,1 +Bachelors,2017,Pune,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Masters,2012,New Delhi,3,28,Male,No,2,0 +Bachelors,2012,Bangalore,3,28,Male,No,3,0 +Bachelors,2012,Pune,2,27,Female,No,5,1 +Bachelors,2012,New Delhi,2,27,Female,No,5,1 +Masters,2012,Bangalore,3,27,Male,No,5,1 +Bachelors,2018,Bangalore,3,25,Female,No,3,1 +Masters,2018,Pune,3,27,Male,No,5,1 +Masters,2017,New Delhi,2,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Masters,2017,Bangalore,2,28,Male,Yes,2,1 +Bachelors,2017,Pune,3,27,Male,No,5,0 +Bachelors,2017,Pune,3,28,Female,No,1,0 +Bachelors,2016,Bangalore,3,28,Male,No,3,0 +Bachelors,2014,New Delhi,3,26,Female,No,4,0 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Bachelors,2017,New Delhi,3,26,Female,No,4,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2017,New Delhi,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,25,Female,Yes,3,0 +Bachelors,2017,Bangalore,3,25,Male,Yes,3,0 +Bachelors,2013,Bangalore,3,28,Female,No,1,1 +Bachelors,2013,Pune,3,24,Female,No,2,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Masters,2017,New Delhi,3,25,Male,No,3,1 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Masters,2017,Pune,2,28,Male,No,3,0 +Masters,2017,New Delhi,3,26,Male,No,4,0 +Masters,2017,Pune,2,24,Female,No,2,0 +Masters,2015,Pune,1,26,Female,No,4,0 +Masters,2013,Pune,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Pune,3,24,Male,No,2,0 +PHD,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Bachelors,2014,Pune,3,25,Male,No,3,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,28,Male,No,3,0 +Bachelors,2014,Pune,3,25,Male,No,3,0 +Masters,2018,New Delhi,3,25,Female,No,3,1 +Bachelors,2013,Pune,2,25,Female,No,3,1 +PHD,2013,New Delhi,3,26,Male,No,4,0 +Bachelors,2015,New Delhi,3,28,Female,No,3,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Masters,2018,New Delhi,1,26,Female,No,4,1 +Bachelors,2013,Pune,2,24,Female,No,2,1 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +PHD,2016,Pune,1,25,Female,No,3,1 +Bachelors,2014,Pune,3,26,Male,No,4,1 +Masters,2015,Pune,1,27,Female,No,5,0 +Bachelors,2013,Pune,3,28,Female,No,2,1 +Bachelors,2016,Bangalore,1,27,Female,No,5,0 +Bachelors,2014,New Delhi,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2015,Pune,3,25,Female,No,3,1 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2015,Bangalore,3,25,Female,No,3,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Masters,2016,Bangalore,3,26,Female,No,4,1 +Bachelors,2018,Bangalore,3,27,Female,No,5,1 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Bachelors,2014,New Delhi,3,24,Female,No,2,0 +Bachelors,2013,Pune,3,26,Male,Yes,4,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Pune,2,26,Female,No,4,1 +Bachelors,2016,New Delhi,3,28,Female,No,5,0 +Bachelors,2015,Bangalore,3,28,Male,No,5,0 +Bachelors,2012,Pune,2,26,Female,No,4,1 +Bachelors,2013,New Delhi,3,26,Female,No,4,0 +Bachelors,2013,Pune,3,24,Male,No,2,0 +Masters,2017,New Delhi,3,28,Female,No,3,0 +Bachelors,2012,New Delhi,3,27,Female,No,5,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2012,New Delhi,3,24,Female,No,2,1 +Masters,2015,Pune,1,24,Male,No,2,0 +Masters,2013,New Delhi,3,27,Male,No,5,1 +Bachelors,2017,New Delhi,3,24,Female,No,2,1 +Bachelors,2014,Bangalore,3,28,Male,No,1,1 +Bachelors,2015,Bangalore,3,28,Female,No,1,0 +Masters,2013,New Delhi,3,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Masters,2015,New Delhi,3,24,Male,No,2,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,25,Female,No,3,0 +Bachelors,2017,Bangalore,1,24,Male,No,2,0 +Bachelors,2014,New Delhi,3,27,Female,No,5,1 +Bachelors,2013,Bangalore,3,27,Female,No,5,0 +Bachelors,2012,Bangalore,3,28,Female,No,2,0 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Pune,1,27,Female,No,5,1 +Bachelors,2014,New Delhi,3,27,Female,Yes,5,0 +Bachelors,2014,Bangalore,3,28,Male,No,4,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,28,Female,No,1,0 +Masters,2018,New Delhi,3,25,Female,No,3,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,24,Male,Yes,2,1 +Masters,2017,Pune,2,25,Female,No,3,1 +Bachelors,2017,New Delhi,2,27,Female,No,5,0 +Bachelors,2016,Bangalore,3,28,Male,No,3,1 +Bachelors,2015,Pune,2,25,Female,Yes,3,1 +Masters,2017,New Delhi,3,24,Male,No,2,0 +Bachelors,2015,Bangalore,3,28,Male,No,4,0 +Masters,2014,Pune,3,26,Male,No,4,1 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Masters,2013,New Delhi,1,24,Female,No,2,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2013,Bangalore,3,28,Male,No,1,0 +Bachelors,2016,Pune,2,28,Female,No,4,1 +Bachelors,2012,Bangalore,3,28,Male,No,1,0 +Bachelors,2017,New Delhi,3,25,Female,No,3,0 +Bachelors,2018,Bangalore,3,25,Male,Yes,3,1 +Bachelors,2012,Pune,1,27,Female,No,5,1 +Masters,2017,New Delhi,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,25,Female,No,3,1 +Bachelors,2017,Bangalore,3,28,Male,No,2,0 +Bachelors,2015,Pune,3,25,Female,No,3,1 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2018,Bangalore,3,24,Male,Yes,2,1 +Bachelors,2016,Bangalore,3,28,Male,Yes,4,0 +Bachelors,2014,Bangalore,3,26,Female,No,4,0 +Bachelors,2017,Bangalore,3,28,Male,No,1,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,New Delhi,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,27,Female,No,5,0 +Bachelors,2014,Bangalore,3,27,Female,Yes,5,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +PHD,2015,New Delhi,2,24,Female,No,2,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2017,New Delhi,2,24,Female,No,2,0 +PHD,2015,Pune,1,25,Female,No,3,1 +Bachelors,2017,New Delhi,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,25,Female,No,3,0 +Bachelors,2014,Bangalore,3,24,Male,Yes,2,0 +Masters,2018,New Delhi,3,26,Male,Yes,4,1 +Bachelors,2015,Bangalore,2,25,Female,No,3,1 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Masters,2012,New Delhi,3,28,Male,Yes,2,0 +Bachelors,2015,Bangalore,3,24,Female,No,2,0 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +PHD,2018,New Delhi,3,27,Female,No,5,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2012,Bangalore,3,28,Male,No,5,0 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2013,Bangalore,3,25,Male,No,3,0 +Masters,2018,Pune,3,24,Male,No,2,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,New Delhi,3,28,Female,No,2,0 +Masters,2017,New Delhi,2,27,Male,Yes,5,1 +Bachelors,2018,Pune,2,27,Female,No,5,1 +Masters,2014,New Delhi,3,28,Female,No,4,0 +Masters,2017,New Delhi,3,25,Female,No,3,0 +Masters,2017,Bangalore,3,26,Female,No,4,0 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Bachelors,2013,New Delhi,3,27,Female,No,5,0 +Masters,2017,New Delhi,1,26,Female,No,4,0 +Bachelors,2013,New Delhi,3,27,Female,No,5,0 +Bachelors,2012,New Delhi,3,28,Male,No,3,0 +Masters,2017,Pune,2,27,Male,No,5,1 +Bachelors,2017,New Delhi,3,26,Female,No,4,0 +Bachelors,2013,Bangalore,3,28,Female,No,4,1 +Masters,2012,New Delhi,3,27,Male,Yes,5,1 +Bachelors,2017,Pune,2,24,Male,No,2,0 +Masters,2017,New Delhi,3,25,Female,No,3,1 +Bachelors,2018,Bangalore,3,25,Female,Yes,3,1 +Bachelors,2016,Bangalore,3,28,Male,Yes,4,0 +Masters,2017,New Delhi,3,28,Male,No,2,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2014,Pune,3,24,Female,No,2,1 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Bachelors,2017,Bangalore,1,26,Female,No,4,0 +Bachelors,2015,Bangalore,3,28,Female,No,3,0 +Bachelors,2013,Bangalore,3,28,Male,No,3,1 +Bachelors,2012,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2013,New Delhi,2,27,Female,No,5,1 +Bachelors,2016,New Delhi,3,24,Female,No,2,0 +Bachelors,2015,Pune,2,28,Female,No,2,1 +Bachelors,2015,New Delhi,2,25,Female,No,3,1 +Bachelors,2014,Pune,3,24,Male,No,2,0 +Bachelors,2017,New Delhi,3,27,Female,No,5,0 +Bachelors,2012,New Delhi,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,28,Male,No,0,0 +Bachelors,2012,Pune,3,28,Male,No,5,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2016,Bangalore,1,26,Male,No,4,0 +Masters,2017,New Delhi,2,28,Female,Yes,2,1 +Masters,2017,New Delhi,2,25,Male,No,3,1 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Male,No,0,0 +Bachelors,2014,Pune,3,27,Male,No,5,1 +Bachelors,2016,Pune,2,26,Female,No,4,1 +Bachelors,2018,Bangalore,3,27,Female,Yes,5,1 +Bachelors,2012,Pune,3,28,Male,No,4,0 +Bachelors,2013,Pune,2,26,Female,No,4,1 +Bachelors,2014,Bangalore,3,28,Female,No,3,0 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Bachelors,2012,New Delhi,1,27,Female,No,5,0 +Bachelors,2017,New Delhi,2,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Masters,2012,New Delhi,3,24,Male,No,2,0 +Bachelors,2013,New Delhi,2,25,Female,No,3,1 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Masters,2013,Pune,3,25,Male,Yes,3,1 +Bachelors,2013,Pune,3,24,Female,No,2,0 +Bachelors,2015,Pune,3,24,Female,No,2,1 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Masters,2012,New Delhi,3,26,Female,No,4,1 +Bachelors,2015,Pune,3,25,Male,No,3,0 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2013,Bangalore,3,28,Male,No,3,0 +Bachelors,2016,Pune,2,28,Female,No,0,1 +Bachelors,2012,New Delhi,3,24,Male,No,2,0 +Bachelors,2015,New Delhi,3,28,Male,No,1,0 +Bachelors,2017,Bangalore,1,24,Male,No,2,0 +Masters,2017,Pune,2,28,Female,No,4,0 +Bachelors,2017,Pune,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,27,Female,No,5,0 +Bachelors,2015,Pune,3,28,Male,No,2,0 +Bachelors,2016,Bangalore,3,28,Female,No,5,0 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Bachelors,2015,Bangalore,3,28,Female,No,5,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,1,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,27,Female,No,5,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,1 +Bachelors,2015,Pune,3,28,Female,No,4,1 +Masters,2017,Bangalore,2,24,Female,Yes,2,1 +Bachelors,2014,Bangalore,3,28,Male,No,2,0 +Masters,2017,Pune,2,24,Female,No,2,1 +Bachelors,2014,New Delhi,3,26,Female,No,4,1 +Bachelors,2015,Pune,2,28,Female,No,3,1 +Masters,2013,Pune,2,28,Male,No,5,1 +Bachelors,2013,New Delhi,1,28,Female,No,5,1 +Bachelors,2015,Pune,2,26,Female,Yes,4,1 +Masters,2015,New Delhi,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,28,Male,No,2,1 +Bachelors,2012,Pune,3,28,Male,No,2,0 +Bachelors,2014,Pune,3,27,Female,No,5,1 +Masters,2018,New Delhi,3,24,Male,No,2,1 +Bachelors,2018,Bangalore,3,25,Male,Yes,3,1 +Bachelors,2017,New Delhi,2,25,Male,No,3,0 +Bachelors,2014,Pune,3,24,Female,No,2,1 +Bachelors,2012,New Delhi,3,26,Female,No,4,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,28,Male,No,4,0 +Bachelors,2018,Bangalore,3,26,Male,Yes,4,1 +Bachelors,2013,Pune,2,26,Male,No,4,0 +Bachelors,2013,Pune,2,25,Female,No,3,1 +Bachelors,2018,Pune,3,25,Male,Yes,3,1 +Bachelors,2013,Bangalore,3,25,Female,No,3,0 +Bachelors,2014,Bangalore,3,28,Male,No,4,0 +Masters,2017,New Delhi,3,24,Female,No,2,0 +Masters,2017,Pune,2,27,Female,No,5,0 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,Pune,3,27,Female,No,5,1 +Masters,2017,New Delhi,2,28,Male,No,4,0 +Bachelors,2017,New Delhi,2,25,Male,No,3,0 +Bachelors,2017,Pune,3,25,Male,Yes,3,1 +Masters,2017,Pune,2,24,Female,No,2,1 +Bachelors,2013,Pune,3,27,Male,Yes,5,1 +Bachelors,2016,Bangalore,3,26,Female,No,4,1 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,1 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Pune,2,27,Female,No,5,1 +Masters,2017,Bangalore,2,28,Male,No,2,0 +Masters,2017,New Delhi,3,24,Female,No,2,1 +Bachelors,2017,Pune,3,24,Male,No,2,0 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Masters,2017,New Delhi,2,28,Male,No,3,0 +Bachelors,2015,Bangalore,3,26,Female,Yes,4,0 +Bachelors,2018,Pune,3,26,Female,No,4,1 +Bachelors,2013,Bangalore,3,25,Male,Yes,3,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Masters,2018,Pune,3,28,Male,No,2,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,27,Female,No,5,0 +PHD,2016,New Delhi,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,2,25,Male,No,3,0 +Bachelors,2015,New Delhi,3,28,Female,No,2,0 +Bachelors,2013,Pune,2,26,Female,No,4,1 +Bachelors,2017,Bangalore,3,27,Female,No,5,0 +Bachelors,2015,Pune,2,24,Female,No,2,1 +Bachelors,2017,Bangalore,3,27,Female,No,5,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,1 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Pune,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,1,25,Male,No,3,0 +Masters,2017,New Delhi,2,25,Female,No,3,0 +PHD,2015,Pune,3,28,Male,No,0,0 +Bachelors,2015,Bangalore,3,28,Male,No,3,0 +Bachelors,2016,Bangalore,3,28,Male,No,5,0 +PHD,2013,New Delhi,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2015,Pune,2,26,Female,Yes,4,1 +Bachelors,2017,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2014,New Delhi,3,26,Male,No,4,0 +Masters,2013,Bangalore,3,27,Male,No,5,1 +Bachelors,2016,Pune,3,24,Male,Yes,2,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Pune,2,28,Female,No,2,1 +Masters,2017,Bangalore,2,24,Male,No,2,1 +Masters,2017,New Delhi,2,24,Male,No,2,1 +Masters,2015,Pune,2,24,Female,No,2,1 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2016,Pune,2,27,Female,No,5,1 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Masters,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2016,Bangalore,1,25,Female,No,3,0 +PHD,2014,Bangalore,1,25,Female,No,3,0 +Bachelors,2013,Bangalore,3,25,Female,No,3,0 +Bachelors,2014,New Delhi,3,24,Male,No,2,0 +Bachelors,2015,Pune,2,28,Female,Yes,2,1 +Bachelors,2014,New Delhi,3,28,Male,No,5,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2018,Pune,3,26,Male,No,4,1 +Masters,2015,Pune,2,28,Female,No,2,0 +Masters,2013,New Delhi,3,28,Male,No,2,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Masters,2015,New Delhi,2,26,Female,No,4,0 +Bachelors,2016,New Delhi,3,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,24,Female,No,2,0 +Masters,2017,Pune,3,24,Female,No,2,0 +Bachelors,2014,Pune,3,25,Female,No,3,1 +Bachelors,2015,Pune,3,27,Female,No,5,1 +Bachelors,2017,New Delhi,2,28,Male,No,0,0 +Bachelors,2017,New Delhi,3,25,Female,No,3,0 +Bachelors,2012,Pune,3,24,Male,No,2,1 +Masters,2016,New Delhi,3,25,Male,No,3,1 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Masters,2014,New Delhi,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,24,Female,No,2,1 +Bachelors,2014,New Delhi,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,New Delhi,3,24,Female,No,2,1 +Bachelors,2012,Bangalore,3,28,Male,No,1,0 +Bachelors,2014,Bangalore,1,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,28,Male,Yes,3,0 +Bachelors,2015,Pune,1,25,Female,No,3,1 +Bachelors,2015,Pune,2,24,Female,Yes,2,1 +Bachelors,2017,Pune,2,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,28,Male,No,0,0 +Bachelors,2016,Bangalore,3,28,Male,No,2,0 +Bachelors,2013,Pune,3,28,Female,Yes,3,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Masters,2015,New Delhi,3,25,Male,No,3,0 +Bachelors,2012,New Delhi,3,28,Female,No,4,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Masters,2017,New Delhi,3,25,Male,No,3,1 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Bachelors,2017,Bangalore,3,26,Female,No,4,0 +Masters,2017,New Delhi,2,25,Male,Yes,3,1 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Bachelors,2017,Pune,3,25,Female,No,3,1 +Bachelors,2014,New Delhi,3,28,Female,Yes,2,0 +Bachelors,2016,Bangalore,3,27,Female,No,5,0 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Bachelors,2012,Bangalore,3,27,Female,Yes,5,0 +Bachelors,2017,New Delhi,3,27,Female,No,5,0 +Bachelors,2016,Bangalore,2,25,Male,No,3,1 +Bachelors,2016,Bangalore,3,28,Female,No,4,0 +Bachelors,2017,New Delhi,2,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,24,Female,No,2,0 +Bachelors,2013,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,New Delhi,2,25,Female,No,3,0 +Bachelors,2015,Pune,3,24,Male,No,2,0 +Bachelors,2012,New Delhi,3,25,Female,No,3,0 +PHD,2017,New Delhi,3,27,Female,No,5,0 +Bachelors,2014,Bangalore,3,25,Female,No,3,1 +Masters,2017,Bangalore,3,28,Male,No,2,0 +Bachelors,2016,Pune,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,25,Male,Yes,3,0 +Bachelors,2012,New Delhi,3,27,Male,No,5,0 +Bachelors,2012,Pune,3,25,Female,No,3,1 +Masters,2015,New Delhi,3,27,Female,No,5,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,1 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2018,New Delhi,3,26,Female,No,4,1 +Bachelors,2017,Pune,2,26,Female,No,4,1 +Bachelors,2014,Pune,2,24,Female,No,2,1 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,2,27,Male,No,5,0 +PHD,2012,New Delhi,3,28,Female,No,1,0 +Masters,2012,New Delhi,3,26,Female,No,4,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,28,Female,No,0,1 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2016,Pune,2,24,Female,No,2,1 +Bachelors,2015,Bangalore,1,24,Female,No,2,1 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Masters,2014,Pune,3,27,Male,No,5,0 +Masters,2017,New Delhi,2,27,Male,No,5,1 +Masters,2017,New Delhi,1,25,Female,No,3,0 +Masters,2012,Pune,3,28,Male,No,0,1 +Masters,2012,New Delhi,3,28,Male,No,2,1 +Masters,2013,New Delhi,2,24,Male,No,2,1 +Bachelors,2015,Pune,3,25,Female,No,3,1 +Masters,2017,New Delhi,3,28,Male,No,5,0 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Masters,2015,Bangalore,3,28,Male,No,1,1 +Bachelors,2018,Bangalore,3,27,Female,Yes,5,1 +Bachelors,2015,Bangalore,3,24,Male,No,2,1 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2013,New Delhi,3,25,Female,No,3,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2018,New Delhi,3,28,Female,No,0,1 +Bachelors,2013,Bangalore,3,25,Female,No,3,0 +PHD,2012,Pune,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Female,No,3,0 +Bachelors,2015,Pune,3,24,Male,No,2,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2012,New Delhi,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,26,Female,Yes,4,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,24,Female,No,2,1 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +PHD,2018,Bangalore,3,27,Female,No,5,1 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,New Delhi,1,26,Female,No,4,1 +Bachelors,2015,Pune,2,24,Female,No,2,1 +Bachelors,2013,Pune,3,27,Male,No,5,0 +PHD,2016,New Delhi,3,24,Female,No,2,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,28,Male,No,5,0 +Bachelors,2015,Bangalore,3,26,Female,No,4,0 +Bachelors,2016,Bangalore,3,27,Female,No,5,0 +Bachelors,2017,Pune,3,25,Female,No,3,1 +Masters,2017,New Delhi,2,26,Male,No,4,1 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,26,Female,No,4,1 +Bachelors,2015,Pune,2,25,Female,No,3,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Pune,2,28,Male,No,1,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +PHD,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,New Delhi,3,25,Female,Yes,3,1 +Bachelors,2017,Bangalore,1,28,Female,No,3,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,New Delhi,3,27,Male,No,5,0 +Masters,2013,Pune,2,28,Male,No,2,1 +Bachelors,2013,New Delhi,3,25,Female,Yes,3,1 +Masters,2017,New Delhi,2,26,Male,No,4,0 +Masters,2016,New Delhi,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,28,Female,Yes,5,0 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Bachelors,2012,Bangalore,1,27,Male,No,5,1 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2016,Bangalore,3,24,Female,No,2,0 +Bachelors,2017,Pune,3,26,Male,No,4,0 +Bachelors,2017,New Delhi,3,25,Female,No,3,0 +Bachelors,2015,Pune,3,28,Female,Yes,5,1 +Bachelors,2015,Bangalore,3,26,Male,No,4,1 +Masters,2015,Pune,2,26,Female,Yes,4,1 +Masters,2015,Pune,3,25,Male,No,3,1 +Bachelors,2016,Pune,3,27,Female,No,5,1 +Bachelors,2013,Bangalore,3,25,Male,No,3,0 +Bachelors,2018,Pune,3,26,Male,Yes,4,1 +Bachelors,2014,Bangalore,3,27,Female,No,5,0 +Bachelors,2017,Bangalore,1,25,Male,No,3,0 +Bachelors,2015,New Delhi,3,26,Male,No,4,0 +Bachelors,2015,Pune,3,24,Female,No,2,1 +Bachelors,2015,Bangalore,3,28,Male,No,2,0 +Bachelors,2014,Pune,2,26,Female,No,4,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2018,New Delhi,3,28,Female,No,5,1 +Bachelors,2015,Bangalore,3,28,Male,No,0,1 +Bachelors,2016,New Delhi,3,28,Female,No,3,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2015,Pune,3,24,Female,No,2,1 +Masters,2018,New Delhi,3,28,Male,No,2,1 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,1 +Bachelors,2017,New Delhi,2,28,Female,No,0,0 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2012,Bangalore,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,1,24,Male,No,2,0 +Bachelors,2016,Pune,3,27,Male,No,5,0 +Bachelors,2013,Pune,3,24,Male,No,2,0 +Masters,2017,Pune,2,26,Female,No,4,1 +Bachelors,2017,New Delhi,3,26,Male,No,4,0 +Bachelors,2018,Pune,3,25,Female,No,3,1 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Bachelors,2015,Pune,3,24,Male,Yes,2,0 +Bachelors,2013,Bangalore,3,24,Female,No,2,1 +Bachelors,2013,Pune,2,28,Male,Yes,0,1 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,28,Female,No,5,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,26,Female,No,4,0 +Masters,2017,Bangalore,2,28,Male,No,2,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,27,Female,No,5,0 +Masters,2018,Bangalore,3,28,Male,No,2,1 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2012,Pune,3,24,Male,No,2,0 +Bachelors,2016,New Delhi,3,28,Male,No,0,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,1 +Bachelors,2012,Bangalore,1,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,28,Female,No,5,0 +Bachelors,2014,Pune,3,25,Male,No,3,0 +Bachelors,2015,Pune,3,25,Male,No,3,0 +Bachelors,2017,Pune,2,28,Male,No,0,1 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Bachelors,2015,Pune,3,26,Female,No,4,1 +Bachelors,2015,Bangalore,2,28,Female,No,3,1 +Bachelors,2012,Pune,3,25,Male,No,3,0 +Bachelors,2013,Bangalore,3,25,Male,Yes,3,1 +Bachelors,2016,New Delhi,3,26,Male,No,4,0 +PHD,2018,New Delhi,3,24,Female,No,2,1 +Bachelors,2014,Bangalore,3,27,Female,No,5,0 +Masters,2017,New Delhi,2,26,Male,Yes,4,1 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Masters,2017,Pune,2,25,Female,No,3,0 +Bachelors,2017,New Delhi,3,28,Female,No,2,0 +Bachelors,2014,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +Bachelors,2018,Pune,3,24,Male,No,2,1 +Bachelors,2015,Bangalore,3,27,Female,Yes,5,1 +Bachelors,2015,New Delhi,3,28,Female,No,3,0 +Bachelors,2015,Pune,3,27,Female,No,5,1 +Bachelors,2015,Bangalore,3,28,Male,No,5,0 +Bachelors,2015,New Delhi,2,27,Female,Yes,5,1 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Masters,2017,New Delhi,3,27,Female,No,5,1 +Bachelors,2017,Pune,2,26,Female,No,4,1 +Bachelors,2015,Pune,3,27,Female,No,5,1 +Bachelors,2018,Pune,3,27,Female,No,5,1 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +PHD,2013,New Delhi,3,27,Female,No,5,1 +Bachelors,2016,Bangalore,3,28,Male,No,2,0 +Bachelors,2012,Bangalore,3,25,Female,Yes,3,0 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Pune,2,24,Female,No,2,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,1 +Bachelors,2014,Pune,3,27,Male,Yes,5,0 +Bachelors,2013,Bangalore,3,24,Male,Yes,2,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,1 +Bachelors,2017,Pune,2,24,Female,No,2,1 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Masters,2013,Bangalore,3,26,Female,No,4,1 +Bachelors,2012,Pune,3,25,Female,No,3,1 +Bachelors,2015,New Delhi,3,28,Female,No,2,0 +Masters,2017,New Delhi,2,24,Female,No,2,0 +Masters,2013,New Delhi,3,26,Male,No,4,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +PHD,2016,New Delhi,3,24,Female,No,2,0 +Bachelors,2017,New Delhi,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,3,28,Female,No,0,0 +PHD,2016,New Delhi,3,27,Female,No,5,0 +Masters,2014,Bangalore,3,28,Female,No,4,1 +Bachelors,2014,Bangalore,3,28,Female,No,2,0 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Masters,2015,New Delhi,3,28,Male,No,0,0 +Bachelors,2015,Pune,2,25,Female,No,3,1 +Masters,2017,Pune,2,27,Male,No,5,1 +Bachelors,2014,Pune,2,25,Female,No,3,1 +Bachelors,2015,Pune,2,28,Female,Yes,2,1 +Bachelors,2013,Pune,3,25,Male,No,3,0 +Bachelors,2013,Pune,1,26,Female,No,4,1 +Bachelors,2012,Pune,2,27,Female,No,5,1 +Masters,2017,New Delhi,3,28,Male,No,0,0 +Bachelors,2012,Bangalore,3,28,Female,No,1,0 +Bachelors,2015,Pune,2,25,Female,Yes,3,1 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,24,Female,No,2,0 +Bachelors,2018,New Delhi,3,24,Female,No,2,1 +Bachelors,2017,New Delhi,3,27,Female,Yes,5,0 +PHD,2012,Pune,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,25,Male,No,3,1 +Bachelors,2015,New Delhi,3,24,Female,No,2,0 +Bachelors,2013,Pune,3,24,Female,No,2,0 +Bachelors,2016,Pune,3,24,Male,No,2,0 +Bachelors,2018,Pune,3,24,Male,Yes,2,1 +Bachelors,2015,Bangalore,3,27,Female,Yes,5,1 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2012,Pune,3,24,Female,No,2,1 +Masters,2017,New Delhi,3,27,Male,No,5,1 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,New Delhi,3,25,Female,No,3,0 +Bachelors,2018,Bangalore,3,24,Female,No,2,1 +Bachelors,2014,Bangalore,3,28,Male,No,4,0 +Bachelors,2013,Pune,1,26,Female,No,4,1 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,1 +Bachelors,2013,Bangalore,3,25,Female,No,3,1 +Bachelors,2016,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2017,Pune,3,26,Male,No,4,0 +Bachelors,2018,Pune,2,28,Female,No,5,1 +Masters,2017,Pune,2,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,25,Female,No,3,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,New Delhi,2,25,Female,No,3,0 +Bachelors,2018,Pune,3,27,Female,No,5,1 +Bachelors,2016,Pune,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,1,24,Male,No,2,0 +Bachelors,2012,Bangalore,1,28,Male,No,3,0 +Bachelors,2016,Pune,2,28,Female,No,3,1 +Bachelors,2016,Pune,3,24,Male,No,2,0 +Bachelors,2017,Bangalore,3,28,Male,No,3,0 +Bachelors,2017,Pune,2,28,Male,No,3,0 +Bachelors,2017,Bangalore,3,25,Female,No,3,1 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Masters,2013,New Delhi,3,25,Male,No,3,1 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2013,Pune,2,24,Female,No,2,1 +Bachelors,2017,Bangalore,3,28,Male,No,1,1 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2015,Pune,1,24,Female,No,2,1 +Masters,2013,New Delhi,3,24,Female,Yes,2,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Masters,2013,New Delhi,3,25,Male,No,3,1 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Pune,2,28,Female,No,3,1 +Masters,2015,New Delhi,3,28,Male,No,2,0 +Bachelors,2015,Bangalore,3,28,Male,No,5,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Pune,3,27,Male,No,5,0 +Bachelors,2015,Pune,2,28,Female,No,5,1 +Masters,2017,New Delhi,2,26,Female,No,4,1 +Bachelors,2016,New Delhi,3,26,Female,No,4,0 +Bachelors,2016,Bangalore,3,26,Female,No,4,0 +Bachelors,2013,New Delhi,3,27,Female,No,5,0 +Bachelors,2014,Bangalore,3,28,Male,No,3,0 +Bachelors,2017,New Delhi,3,25,Male,No,3,0 +Bachelors,2015,Bangalore,1,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,24,Female,No,2,0 +Bachelors,2014,Pune,2,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,24,Male,No,2,1 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2012,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2012,Bangalore,3,28,Male,No,1,0 +Masters,2017,New Delhi,2,25,Female,No,3,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2016,Pune,2,27,Female,No,5,1 +Bachelors,2017,Pune,3,28,Male,No,3,0 +Masters,2017,New Delhi,3,28,Male,No,2,0 +PHD,2018,Pune,3,26,Male,No,4,1 +Masters,2017,New Delhi,2,24,Male,No,2,1 +Bachelors,2014,Bangalore,3,28,Male,No,0,0 +Masters,2015,Pune,3,26,Female,No,4,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,1 +Bachelors,2016,New Delhi,3,28,Female,No,4,0 +Bachelors,2012,Pune,3,26,Male,No,4,0 +Masters,2015,Bangalore,2,27,Female,No,5,1 +Masters,2017,Pune,1,28,Male,No,0,0 +Masters,2015,New Delhi,3,28,Female,No,2,0 +Bachelors,2017,Bangalore,3,26,Male,No,4,1 +Bachelors,2017,Pune,3,28,Female,No,4,1 +Bachelors,2015,Pune,3,25,Male,No,3,0 +Masters,2017,New Delhi,2,27,Female,No,5,0 +Masters,2015,Pune,2,27,Female,No,5,0 +Bachelors,2015,Bangalore,3,25,Male,No,3,1 +Bachelors,2013,Bangalore,3,28,Female,No,1,0 +Bachelors,2015,Pune,3,25,Female,No,3,1 +Bachelors,2012,Bangalore,3,28,Female,No,2,1 +Bachelors,2016,Pune,3,27,Female,No,5,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +PHD,2018,New Delhi,3,26,Male,No,4,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Pune,3,28,Male,No,2,1 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,New Delhi,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,28,Male,Yes,1,0 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Bachelors,2016,Bangalore,1,24,Male,No,2,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Pune,2,27,Female,No,5,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,3,27,Male,No,5,0 +Masters,2018,New Delhi,3,24,Male,No,2,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,1 +Bachelors,2017,Bangalore,3,28,Male,Yes,3,0 +Bachelors,2017,New Delhi,3,26,Female,No,4,0 +Bachelors,2016,Pune,3,28,Male,No,3,0 +Bachelors,2015,New Delhi,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,1 +Bachelors,2017,Pune,2,24,Female,No,2,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,1 +PHD,2016,New Delhi,1,26,Male,No,4,0 +Bachelors,2018,Bangalore,3,24,Female,No,2,1 +Bachelors,2017,Bangalore,2,28,Female,No,1,0 +Bachelors,2013,Bangalore,3,24,Female,No,2,0 +Masters,2014,New Delhi,3,25,Female,No,3,0 +Bachelors,2012,Pune,1,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,28,Male,No,5,0 +Bachelors,2013,Bangalore,3,28,Male,No,2,1 +Masters,2017,Pune,2,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,28,Male,Yes,0,0 +Bachelors,2014,New Delhi,3,25,Male,No,3,0 +Bachelors,2013,Bangalore,3,25,Female,No,3,1 +Bachelors,2017,Bangalore,3,24,Female,No,2,1 +Bachelors,2015,Bangalore,3,26,Female,No,4,0 +Bachelors,2014,Bangalore,3,28,Male,No,4,0 +Bachelors,2017,New Delhi,2,28,Male,No,0,0 +Masters,2017,New Delhi,3,24,Female,No,2,0 +PHD,2017,Pune,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,28,Female,No,5,0 +Bachelors,2017,New Delhi,3,25,Female,No,3,0 +Masters,2017,Bangalore,3,25,Male,No,3,0 +Masters,2017,Bangalore,1,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,1 +Bachelors,2016,Bangalore,3,27,Male,No,5,1 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Pune,3,25,Male,No,3,1 +Bachelors,2018,Bangalore,3,25,Female,No,3,1 +Masters,2012,Pune,3,26,Male,No,4,1 +PHD,2016,Bangalore,3,25,Male,No,3,0 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,New Delhi,2,25,Male,No,3,1 +Bachelors,2015,New Delhi,3,27,Female,No,5,0 +Bachelors,2017,Pune,3,26,Male,No,4,0 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Masters,2018,New Delhi,3,25,Female,No,3,1 +Masters,2017,Pune,2,25,Male,No,3,0 +Masters,2014,Bangalore,3,24,Female,No,2,0 +Bachelors,2014,Pune,3,28,Female,No,2,1 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Pune,3,26,Male,No,4,0 +Bachelors,2014,Pune,2,28,Female,No,0,1 +Bachelors,2017,New Delhi,3,25,Female,Yes,3,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,26,Female,No,4,0 +Masters,2017,Bangalore,2,26,Male,No,4,1 +Bachelors,2017,New Delhi,3,25,Female,No,3,0 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Bachelors,2014,New Delhi,3,27,Female,No,5,0 +Bachelors,2017,Bangalore,3,28,Male,No,5,0 +Bachelors,2015,Bangalore,1,24,Female,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,1 +Bachelors,2018,Bangalore,3,26,Female,No,4,1 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Bachelors,2016,Pune,3,28,Female,No,4,1 +Bachelors,2016,Bangalore,3,25,Male,No,3,0 +Bachelors,2015,Pune,3,27,Female,Yes,5,1 +Bachelors,2015,Bangalore,3,26,Male,No,4,1 +Bachelors,2015,Pune,3,28,Female,Yes,5,1 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Masters,2017,Pune,2,25,Male,No,3,0 +Bachelors,2015,Pune,2,25,Female,Yes,3,1 +Bachelors,2015,Pune,2,24,Female,No,2,1 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Bachelors,2014,New Delhi,3,24,Female,No,2,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,1 +Bachelors,2015,Pune,2,28,Female,No,5,1 +Bachelors,2015,New Delhi,2,27,Female,No,5,1 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Masters,2016,New Delhi,3,25,Female,No,3,0 +Bachelors,2012,Pune,3,24,Male,Yes,2,0 +Bachelors,2015,New Delhi,3,24,Female,No,2,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Masters,2017,Pune,2,27,Female,No,5,0 +Bachelors,2013,Bangalore,1,24,Female,No,2,1 +PHD,2017,Pune,3,28,Male,No,1,0 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Bachelors,2015,Pune,2,24,Female,No,2,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,New Delhi,3,28,Male,No,4,0 +Masters,2017,New Delhi,2,28,Female,No,2,0 +PHD,2014,New Delhi,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2014,New Delhi,3,24,Male,No,2,0 +Bachelors,2013,New Delhi,3,24,Female,No,2,0 +Masters,2017,New Delhi,3,26,Male,No,4,1 +Bachelors,2014,Pune,2,27,Male,No,5,0 +Masters,2013,Bangalore,3,25,Male,No,3,1 +Masters,2012,New Delhi,3,27,Female,No,5,1 +Masters,2017,Bangalore,2,25,Male,No,3,0 +Bachelors,2012,New Delhi,3,28,Male,No,5,0 +Bachelors,2014,Bangalore,3,28,Male,No,0,0 +Bachelors,2017,New Delhi,3,28,Female,No,4,0 +Bachelors,2016,Pune,3,27,Male,No,5,1 +Bachelors,2017,New Delhi,2,27,Female,No,5,0 +PHD,2014,Bangalore,3,28,Female,No,0,0 +Bachelors,2013,Pune,2,25,Male,No,3,1 +Bachelors,2017,Pune,3,28,Male,No,3,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,2,24,Female,No,2,1 +Masters,2017,New Delhi,2,25,Male,No,3,0 +Bachelors,2014,Pune,3,24,Male,No,2,0 +Bachelors,2013,New Delhi,1,25,Female,No,3,1 +Bachelors,2015,Pune,3,28,Male,No,2,0 +Masters,2017,New Delhi,3,28,Male,No,1,1 +Bachelors,2017,New Delhi,2,27,Female,No,5,0 +Bachelors,2018,Pune,3,24,Male,No,2,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,27,Female,Yes,5,0 +Masters,2017,New Delhi,1,26,Female,No,4,1 +Masters,2017,Bangalore,2,26,Female,No,4,0 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Masters,2014,New Delhi,1,25,Female,No,3,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,28,Female,No,5,0 +Masters,2012,New Delhi,3,25,Male,No,3,1 +Bachelors,2013,Bangalore,3,28,Male,No,2,1 +Bachelors,2014,Bangalore,1,25,Male,No,3,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2013,Pune,3,28,Male,No,0,0 +Bachelors,2015,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2014,Pune,1,28,Female,No,3,1 +Masters,2017,Pune,2,25,Female,No,3,1 +Masters,2013,New Delhi,3,28,Female,No,2,0 +Masters,2017,Bangalore,2,27,Female,No,5,1 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,New Delhi,3,26,Female,No,4,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2017,New Delhi,2,28,Female,No,3,0 +Bachelors,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2013,Pune,2,27,Female,No,5,1 +Masters,2015,Bangalore,3,27,Female,No,5,0 +Masters,2017,Pune,3,27,Female,No,5,1 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,25,Female,No,3,0 +Bachelors,2016,Bangalore,3,26,Female,No,4,0 +Bachelors,2016,Bangalore,3,26,Female,No,4,0 +Bachelors,2014,New Delhi,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,28,Male,No,3,0 +Bachelors,2012,Pune,3,25,Male,No,3,0 +Masters,2014,Bangalore,3,28,Female,No,3,1 +Bachelors,2016,New Delhi,3,26,Male,No,4,0 +Bachelors,2012,New Delhi,3,24,Female,No,2,0 +Bachelors,2015,Pune,2,28,Female,No,4,1 +Bachelors,2017,New Delhi,2,24,Male,No,2,0 +Bachelors,2015,New Delhi,3,25,Male,No,3,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,28,Female,No,3,1 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Masters,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2016,Bangalore,3,25,Male,Yes,3,1 +Bachelors,2016,Bangalore,3,26,Male,Yes,4,0 +Masters,2017,Bangalore,2,24,Female,No,2,0 +Bachelors,2017,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2014,Pune,2,27,Female,No,5,1 +Masters,2017,New Delhi,1,24,Female,No,2,0 +Bachelors,2014,Bangalore,3,28,Male,No,1,0 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Bachelors,2014,Pune,3,28,Male,No,0,0 +Masters,2013,New Delhi,3,28,Male,No,1,0 +Masters,2017,Pune,2,27,Female,No,5,0 +Bachelors,2017,Pune,3,28,Male,No,1,0 +Bachelors,2016,New Delhi,3,26,Female,No,4,0 +PHD,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2013,Pune,3,25,Male,No,3,0 +Masters,2017,Pune,3,25,Male,No,3,0 +Bachelors,2017,Pune,2,24,Female,No,2,1 +Bachelors,2017,New Delhi,3,24,Female,No,2,0 +PHD,2014,Pune,3,24,Male,No,2,0 +PHD,2017,Bangalore,3,24,Female,No,2,0 +Masters,2017,New Delhi,2,26,Male,No,4,1 +Bachelors,2013,Pune,2,24,Male,Yes,2,1 +PHD,2016,New Delhi,3,27,Female,No,5,0 +Masters,2017,New Delhi,2,25,Female,Yes,3,1 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2017,New Delhi,3,25,Female,No,3,0 +Bachelors,2012,Bangalore,3,27,Female,No,5,0 +Bachelors,2016,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,27,Female,Yes,5,1 +Bachelors,2016,Pune,3,28,Female,No,2,1 +Masters,2017,New Delhi,2,27,Female,No,5,1 +Bachelors,2018,Bangalore,3,25,Female,No,3,1 +Bachelors,2014,Pune,3,27,Male,Yes,5,0 +Bachelors,2014,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2015,New Delhi,3,25,Female,No,3,0 +Masters,2017,Bangalore,3,26,Female,No,4,0 +Masters,2018,New Delhi,3,25,Male,No,3,1 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Bachelors,2014,Bangalore,3,28,Male,No,1,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Female,No,3,0 +Bachelors,2015,Pune,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,New Delhi,3,25,Female,No,3,0 +Masters,2017,New Delhi,1,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,25,Female,No,3,0 +Bachelors,2013,Pune,2,26,Male,Yes,4,0 +Bachelors,2018,Pune,1,26,Male,Yes,4,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,24,Female,No,2,0 +PHD,2017,New Delhi,3,28,Male,No,3,0 +Bachelors,2017,New Delhi,2,24,Female,No,2,1 +Bachelors,2015,Bangalore,3,25,Female,No,3,0 +Bachelors,2015,Pune,3,26,Male,No,4,0 +Masters,2014,Bangalore,3,27,Male,No,5,1 +Bachelors,2012,Pune,3,24,Female,No,2,1 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2013,Bangalore,3,24,Female,No,2,0 +Bachelors,2017,Bangalore,3,26,Female,No,4,0 +Masters,2017,New Delhi,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2015,Pune,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,24,Male,Yes,2,0 +Masters,2015,Pune,2,28,Female,No,0,0 +Bachelors,2017,Pune,3,26,Male,Yes,4,0 +Bachelors,2018,Bangalore,3,27,Female,No,5,1 +Masters,2017,Pune,3,27,Male,No,5,1 +Bachelors,2013,Bangalore,1,27,Female,No,5,0 +Bachelors,2016,Bangalore,3,27,Female,No,5,0 +Bachelors,2013,Pune,3,28,Male,No,1,0 +Bachelors,2017,Pune,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,25,Female,No,3,0 +Bachelors,2015,Pune,3,24,Female,No,2,1 +Bachelors,2014,New Delhi,3,28,Male,No,1,0 +Bachelors,2017,New Delhi,2,28,Female,No,2,0 +Masters,2015,New Delhi,3,26,Male,No,4,1 +PHD,2014,New Delhi,3,25,Male,No,3,0 +Bachelors,2013,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2013,New Delhi,2,24,Female,No,2,1 +Bachelors,2014,Pune,3,25,Male,No,3,0 +Bachelors,2017,New Delhi,3,25,Female,No,3,0 +Masters,2017,New Delhi,2,24,Male,Yes,2,1 +Bachelors,2015,New Delhi,3,28,Female,No,2,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,1 +Bachelors,2015,Pune,3,26,Male,No,4,0 +Bachelors,2017,Pune,2,27,Female,No,5,1 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,2,26,Female,No,4,1 +Masters,2017,New Delhi,2,25,Female,No,3,0 +Bachelors,2012,New Delhi,3,25,Female,No,3,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,25,Female,No,3,1 +Bachelors,2016,Pune,3,27,Female,No,5,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Pune,2,28,Female,No,1,1 +Bachelors,2017,Bangalore,2,28,Female,No,2,1 +Bachelors,2017,New Delhi,2,26,Female,No,4,1 +Bachelors,2013,Pune,2,27,Female,No,5,1 +Bachelors,2012,Bangalore,3,24,Female,No,2,0 +Masters,2017,Pune,2,27,Female,No,5,0 +Bachelors,2015,New Delhi,3,24,Male,No,2,0 +Bachelors,2013,New Delhi,3,28,Female,Yes,2,0 +Bachelors,2016,New Delhi,3,28,Male,No,0,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2018,Bangalore,3,27,Male,Yes,5,1 +Bachelors,2015,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2018,Pune,3,24,Male,Yes,2,1 +Bachelors,2017,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,26,Male,Yes,4,0 +Masters,2017,Bangalore,2,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,25,Female,No,3,0 +Masters,2013,Pune,3,25,Male,No,3,0 +Masters,2016,New Delhi,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,28,Female,No,1,0 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +PHD,2013,Bangalore,2,25,Male,No,3,1 +Bachelors,2017,New Delhi,3,25,Male,No,3,0 +Bachelors,2015,Bangalore,3,24,Male,No,2,0 +Masters,2015,Bangalore,3,26,Female,No,4,1 +Bachelors,2013,Bangalore,3,25,Female,No,3,0 +Bachelors,2015,New Delhi,2,24,Female,No,2,1 +Masters,2015,New Delhi,2,27,Female,No,5,1 +Bachelors,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,25,Male,No,3,0 +PHD,2017,New Delhi,3,24,Male,No,2,0 +Masters,2015,Bangalore,3,27,Male,No,5,1 +Bachelors,2015,New Delhi,2,28,Female,No,1,1 +Bachelors,2014,Bangalore,3,28,Male,No,2,1 +Bachelors,2014,Bangalore,3,25,Male,Yes,3,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Masters,2017,New Delhi,1,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Male,No,0,0 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,28,Female,No,1,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Masters,2017,New Delhi,2,28,Male,No,3,0 +Bachelors,2013,Pune,3,24,Female,No,2,1 +Masters,2017,New Delhi,2,24,Male,No,2,1 +Bachelors,2014,Bangalore,3,28,Female,No,1,1 +Bachelors,2018,Bangalore,3,25,Male,No,3,1 +Masters,2012,New Delhi,3,27,Female,No,5,0 +Masters,2014,New Delhi,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,28,Male,No,5,0 +Bachelors,2017,Pune,3,28,Female,No,1,0 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,New Delhi,3,24,Male,Yes,2,0 +Masters,2018,New Delhi,3,28,Male,Yes,2,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Masters,2013,New Delhi,3,25,Male,No,3,1 +Masters,2017,Bangalore,3,28,Female,No,0,1 +PHD,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2017,Bangalore,1,24,Male,No,2,0 +Bachelors,2017,New Delhi,2,25,Male,No,3,0 +Masters,2015,Pune,2,28,Female,No,0,0 +Bachelors,2014,Pune,2,27,Female,No,5,1 +Bachelors,2014,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Pune,3,27,Male,Yes,5,0 +Bachelors,2017,Bangalore,3,28,Male,No,2,0 +Bachelors,2014,Bangalore,3,28,Male,No,1,0 +Bachelors,2014,New Delhi,3,28,Female,No,3,0 +Bachelors,2015,New Delhi,2,29,Female,No,1,1 +Bachelors,2012,Bangalore,3,29,Male,No,1,0 +Bachelors,2017,Pune,2,26,Male,No,4,0 +Bachelors,2015,Pune,3,28,Female,No,2,1 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Masters,2017,New Delhi,3,26,Female,No,4,0 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,28,Male,No,1,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Pune,3,28,Female,Yes,2,1 +Bachelors,2017,New Delhi,3,28,Female,No,1,0 +Bachelors,2016,New Delhi,3,27,Female,Yes,5,0 +Bachelors,2018,Pune,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,29,Male,Yes,2,0 +Bachelors,2015,Pune,2,28,Female,No,2,1 +Bachelors,2017,Pune,3,26,Female,No,4,1 +Masters,2017,New Delhi,3,28,Male,No,2,0 +Bachelors,2017,Pune,3,26,Male,No,4,0 +Bachelors,2017,Pune,3,26,Female,No,4,1 +Bachelors,2018,Bangalore,3,26,Female,Yes,4,1 +Bachelors,2014,Pune,3,30,Male,No,2,0 +Masters,2017,New Delhi,3,29,Male,No,2,1 +Masters,2017,Pune,2,26,Female,No,4,0 +Masters,2015,New Delhi,3,28,Female,No,2,0 +Bachelors,2016,Bangalore,3,30,Female,No,2,1 +Bachelors,2012,Bangalore,3,26,Female,No,4,1 +Bachelors,2014,Bangalore,3,29,Male,No,1,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2018,Bangalore,3,26,Male,Yes,4,1 +PHD,2018,New Delhi,2,29,Female,No,1,1 +Masters,2013,New Delhi,3,26,Male,No,4,1 +Masters,2015,Pune,3,30,Female,No,2,0 +Bachelors,2018,Pune,3,26,Male,No,4,1 +Masters,2013,New Delhi,2,29,Female,No,2,1 +Bachelors,2016,Bangalore,3,29,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Male,Yes,1,0 +Bachelors,2017,Pune,2,26,Female,No,4,1 +Masters,2017,Pune,2,30,Female,No,2,0 +Bachelors,2015,Pune,2,30,Female,Yes,1,1 +Masters,2017,New Delhi,2,29,Female,No,2,1 +Bachelors,2015,Bangalore,3,30,Male,No,2,0 +Bachelors,2015,Bangalore,3,27,Female,No,5,1 +Bachelors,2017,Pune,3,27,Female,No,5,1 +Bachelors,2014,Bangalore,3,30,Male,No,2,0 +Bachelors,2014,Bangalore,3,26,Female,No,4,0 +Masters,2013,New Delhi,3,26,Male,No,4,0 +Bachelors,2013,New Delhi,3,29,Female,No,1,1 +Bachelors,2018,New Delhi,3,27,Female,No,5,1 +Bachelors,2014,Bangalore,3,29,Male,No,1,0 +Bachelors,2017,Pune,3,26,Female,No,4,1 +Masters,2015,Bangalore,2,27,Female,Yes,5,1 +Masters,2017,New Delhi,2,29,Female,No,2,0 +Masters,2017,Bangalore,3,26,Female,No,4,0 +Bachelors,2015,Bangalore,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,1 +Bachelors,2014,New Delhi,3,28,Female,No,2,0 +Bachelors,2012,Bangalore,3,29,Male,No,1,1 +Bachelors,2016,New Delhi,3,28,Female,No,2,0 +Masters,2012,New Delhi,3,26,Female,No,4,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Pune,3,28,Male,No,2,0 +Bachelors,2012,Bangalore,2,27,Female,No,5,1 +Bachelors,2018,Bangalore,3,28,Male,No,1,1 +Bachelors,2015,Pune,2,26,Female,No,4,1 +PHD,2016,Bangalore,3,29,Female,No,1,0 +Masters,2018,Bangalore,3,30,Female,No,2,1 +Bachelors,2014,Bangalore,3,28,Female,No,2,0 +Masters,2017,New Delhi,2,30,Male,No,2,0 +Bachelors,2012,Bangalore,3,30,Male,No,1,0 +Masters,2017,New Delhi,2,30,Male,No,2,0 +Bachelors,2017,New Delhi,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,28,Female,No,2,0 +Masters,2013,New Delhi,3,26,Female,No,4,0 +PHD,2015,New Delhi,1,29,Male,No,2,0 +Masters,2017,New Delhi,2,27,Female,No,5,1 +Bachelors,2016,Pune,3,30,Male,No,1,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,1 +Bachelors,2014,Pune,2,29,Female,No,2,1 +Bachelors,2016,Bangalore,3,30,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Female,No,5,0 +PHD,2015,New Delhi,2,29,Female,Yes,1,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,30,Male,No,2,1 +Masters,2017,Pune,2,29,Female,No,2,0 +Masters,2016,Bangalore,3,29,Female,No,2,0 +Bachelors,2017,Bangalore,3,27,Female,No,5,1 +Bachelors,2017,Bangalore,3,28,Male,No,2,0 +Bachelors,2017,Bangalore,3,27,Female,No,5,0 +Bachelors,2012,New Delhi,3,29,Male,No,1,0 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,28,Female,No,1,1 +Bachelors,2013,Pune,2,29,Female,No,1,1 +Bachelors,2015,Bangalore,1,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,30,Male,No,1,0 +Bachelors,2013,New Delhi,3,30,Female,No,1,0 +Masters,2017,Pune,2,27,Male,No,5,1 +Masters,2017,Pune,2,29,Male,No,2,0 +Bachelors,2016,New Delhi,3,29,Female,No,1,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,New Delhi,3,28,Female,Yes,1,0 +Bachelors,2013,Pune,2,28,Female,No,1,1 +Bachelors,2016,Bangalore,3,27,Female,Yes,5,0 +Bachelors,2017,Bangalore,3,26,Male,No,4,1 +Bachelors,2014,New Delhi,3,30,Male,No,2,1 +Bachelors,2015,Pune,2,30,Male,No,2,1 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Pune,3,26,Female,No,4,1 +Bachelors,2014,New Delhi,3,30,Male,No,1,0 +Masters,2017,Pune,2,26,Male,No,4,1 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +PHD,2017,Pune,3,28,Male,No,1,0 +Bachelors,2015,New Delhi,3,30,Female,No,2,0 +Bachelors,2016,Bangalore,3,29,Male,No,2,0 +Bachelors,2012,Bangalore,3,28,Male,No,2,0 +Bachelors,2014,Bangalore,1,30,Male,Yes,2,1 +Bachelors,2013,Bangalore,3,27,Male,No,5,1 +Masters,2017,Pune,2,30,Male,No,2,0 +Bachelors,2012,Bangalore,3,30,Male,No,2,0 +Masters,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2014,Pune,2,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,29,Female,No,1,1 +Bachelors,2015,Pune,3,29,Female,No,2,1 +Bachelors,2013,Bangalore,3,28,Female,No,1,0 +Masters,2016,Bangalore,3,29,Male,No,1,0 +Masters,2016,New Delhi,3,26,Female,No,4,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Masters,2015,New Delhi,1,27,Male,Yes,5,1 +Bachelors,2012,Bangalore,3,28,Male,No,1,1 +Masters,2017,Pune,2,27,Male,No,5,0 +Masters,2015,Pune,2,29,Female,No,2,0 +Bachelors,2012,Bangalore,3,28,Male,No,2,0 +Bachelors,2012,Pune,2,28,Male,No,2,1 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Masters,2017,Pune,2,29,Female,No,1,0 +Bachelors,2014,Pune,2,28,Female,No,1,1 +Masters,2012,New Delhi,1,29,Female,No,1,0 +Bachelors,2015,Bangalore,3,30,Female,No,2,0 +Masters,2017,Bangalore,2,26,Male,Yes,4,1 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,1,30,Male,No,1,0 +Masters,2017,New Delhi,3,30,Male,Yes,2,0 +Bachelors,2015,Pune,2,27,Female,Yes,5,1 +Bachelors,2016,Bangalore,3,28,Male,No,2,1 +Bachelors,2017,Pune,2,26,Female,No,4,1 +Masters,2015,New Delhi,2,26,Female,No,4,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +PHD,2013,New Delhi,3,27,Female,Yes,5,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,1 +Bachelors,2013,New Delhi,3,29,Female,No,1,0 +Masters,2017,Pune,3,29,Male,No,2,0 +Bachelors,2016,Pune,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,29,Male,No,1,0 +Bachelors,2016,Pune,3,29,Male,No,2,0 +Masters,2016,New Delhi,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,30,Female,No,1,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,27,Female,No,5,0 +Bachelors,2016,Bangalore,3,29,Male,No,2,0 +Bachelors,2016,Bangalore,3,29,Male,No,1,0 +Masters,2014,New Delhi,3,29,Male,No,1,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,1,27,Female,No,5,0 +Bachelors,2015,New Delhi,3,26,Female,No,4,0 +Bachelors,2015,Pune,1,28,Female,No,2,1 +Bachelors,2015,Pune,2,28,Female,No,1,1 +Bachelors,2018,Pune,2,28,Female,No,2,1 +Bachelors,2015,Pune,3,28,Female,Yes,1,1 +Bachelors,2015,Pune,3,29,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Pune,2,27,Female,No,5,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,1 +Bachelors,2016,Bangalore,3,30,Male,Yes,1,0 +PHD,2015,New Delhi,3,28,Male,No,2,1 +Bachelors,2014,Pune,3,29,Male,No,2,0 +Bachelors,2015,Bangalore,3,29,Male,No,1,0 +Bachelors,2013,Pune,3,30,Male,No,2,0 +Bachelors,2013,Bangalore,3,28,Male,Yes,1,0 +Bachelors,2015,Pune,2,29,Female,No,2,1 +Bachelors,2017,Bangalore,3,30,Male,No,1,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Masters,2017,New Delhi,2,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,29,Male,No,1,1 +Masters,2012,New Delhi,1,30,Female,No,2,1 +Masters,2016,New Delhi,3,28,Female,No,2,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,28,Female,No,1,0 +Bachelors,2018,Pune,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,29,Female,No,2,0 +PHD,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,29,Male,No,2,0 +Bachelors,2014,Bangalore,3,28,Male,No,2,0 +Bachelors,2014,Bangalore,3,26,Female,No,4,0 +Bachelors,2012,Bangalore,3,28,Male,No,2,0 +Masters,2018,Bangalore,3,28,Female,No,2,1 +Bachelors,2017,Bangalore,3,28,Female,No,1,0 +Bachelors,2015,Bangalore,3,28,Male,No,1,0 +Bachelors,2014,New Delhi,3,29,Female,No,1,0 +Masters,2017,New Delhi,3,28,Male,No,2,0 +Masters,2017,New Delhi,3,29,Male,No,1,0 +Bachelors,2014,Pune,2,29,Male,No,2,1 +Masters,2013,New Delhi,3,26,Male,No,4,1 +Bachelors,2014,Bangalore,3,30,Male,No,1,0 +Bachelors,2013,New Delhi,3,26,Female,No,4,0 +Bachelors,2014,Bangalore,1,29,Male,No,2,0 +Masters,2016,Pune,3,29,Male,No,2,0 +PHD,2016,Pune,1,28,Male,No,2,0 +PHD,2015,Bangalore,3,29,Male,No,2,0 +Bachelors,2014,Bangalore,3,28,Male,No,1,0 +Bachelors,2015,Pune,2,26,Female,Yes,4,1 +Bachelors,2015,Bangalore,3,28,Female,No,1,0 +Bachelors,2015,Pune,3,28,Male,Yes,2,0 +Bachelors,2016,New Delhi,3,26,Female,No,4,0 +Bachelors,2014,Bangalore,3,29,Male,No,1,1 +Bachelors,2013,Bangalore,2,30,Female,No,1,1 +Bachelors,2015,Bangalore,3,29,Male,Yes,1,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +PHD,2017,New Delhi,3,29,Male,No,1,0 +Masters,2017,New Delhi,3,29,Male,No,2,0 +Bachelors,2015,Pune,2,30,Female,Yes,1,1 +Bachelors,2012,New Delhi,3,26,Female,No,4,0 +Bachelors,2013,Pune,3,30,Male,No,1,0 +Bachelors,2012,Bangalore,3,30,Female,No,1,1 +Bachelors,2015,New Delhi,3,26,Female,No,4,0 +Bachelors,2015,Pune,3,28,Female,Yes,2,1 +Bachelors,2014,Bangalore,3,29,Male,No,1,0 +Bachelors,2013,Pune,2,28,Female,No,1,1 +Bachelors,2016,Bangalore,3,28,Female,No,1,0 +Masters,2018,New Delhi,3,30,Female,No,2,1 +Bachelors,2018,Pune,3,29,Male,Yes,1,1 +Bachelors,2016,Bangalore,3,30,Female,Yes,2,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Masters,2017,Pune,2,27,Male,Yes,5,1 +Masters,2017,Pune,2,26,Female,No,4,1 +Masters,2017,New Delhi,3,26,Male,No,4,1 +Bachelors,2017,Pune,2,30,Female,No,2,1 +Bachelors,2012,Bangalore,3,28,Male,No,1,0 +Bachelors,2014,Bangalore,3,28,Male,No,2,0 +PHD,2015,Bangalore,3,29,Female,No,1,0 +Masters,2015,New Delhi,3,26,Male,No,4,1 +Bachelors,2017,Pune,3,30,Male,No,2,0 +Bachelors,2014,New Delhi,3,28,Female,No,1,0 +Bachelors,2013,Bangalore,1,30,Male,No,1,0 +Bachelors,2016,Bangalore,3,27,Female,No,5,1 +Bachelors,2014,Pune,1,28,Male,No,1,0 +Bachelors,2015,Bangalore,3,30,Male,No,1,0 +Bachelors,2013,New Delhi,3,27,Male,No,5,0 +Bachelors,2017,Pune,2,27,Male,No,5,0 +Masters,2017,New Delhi,2,28,Male,No,1,1 +Masters,2017,New Delhi,2,27,Male,No,5,1 +Masters,2014,New Delhi,3,27,Male,No,5,0 +PHD,2014,New Delhi,2,27,Female,No,5,0 +Bachelors,2015,Bangalore,3,29,Male,No,2,0 +Bachelors,2012,Pune,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,30,Male,No,2,0 +Bachelors,2014,Bangalore,1,27,Female,No,5,0 +Bachelors,2014,Pune,1,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,29,Male,Yes,2,0 +Bachelors,2012,New Delhi,3,30,Male,No,1,0 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Masters,2017,New Delhi,2,30,Female,No,2,0 +Masters,2018,New Delhi,3,29,Male,No,2,1 +Bachelors,2015,Bangalore,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2016,New Delhi,3,27,Male,Yes,5,1 +Bachelors,2014,Pune,1,26,Female,No,4,1 +Bachelors,2017,Pune,3,27,Male,Yes,5,0 +PHD,2013,New Delhi,3,30,Male,No,1,0 +Masters,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,New Delhi,3,26,Female,No,4,0 +Bachelors,2016,Pune,3,29,Male,No,2,0 +Bachelors,2018,Bangalore,3,29,Female,Yes,2,1 +Bachelors,2016,Bangalore,3,28,Male,No,1,0 +Masters,2012,Pune,3,30,Male,No,1,0 +Bachelors,2014,Bangalore,3,30,Female,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,29,Female,No,1,0 +Bachelors,2013,Pune,3,28,Male,No,2,0 +Bachelors,2014,Pune,3,29,Male,No,2,0 +Bachelors,2012,Bangalore,1,30,Female,No,2,0 +Bachelors,2018,Pune,3,28,Male,No,2,1 +Bachelors,2012,Bangalore,3,30,Female,Yes,2,0 +Masters,2017,New Delhi,2,30,Male,No,1,0 +Bachelors,2014,New Delhi,3,27,Female,No,5,0 +Masters,2014,New Delhi,3,29,Male,No,2,0 +Bachelors,2016,Bangalore,3,29,Male,No,2,0 +Bachelors,2014,Pune,2,28,Female,No,2,1 +Bachelors,2017,New Delhi,3,26,Male,No,4,0 +Bachelors,2018,Pune,3,28,Male,No,1,1 +Bachelors,2016,Pune,3,29,Male,No,1,0 +Bachelors,2015,Pune,3,26,Female,Yes,4,1 +Masters,2017,Bangalore,3,27,Male,No,5,1 +Masters,2017,New Delhi,2,26,Male,No,4,0 +Masters,2013,New Delhi,3,26,Female,No,4,1 +Bachelors,2017,Bangalore,3,29,Male,No,1,0 +Masters,2013,New Delhi,3,27,Female,No,5,0 +Bachelors,2012,Pune,2,30,Female,No,2,1 +Bachelors,2013,New Delhi,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,28,Female,No,1,1 +Bachelors,2013,New Delhi,3,27,Male,No,5,0 +Bachelors,2015,Pune,2,29,Female,Yes,2,1 +Bachelors,2012,Bangalore,1,27,Female,No,5,0 +Bachelors,2012,Bangalore,3,28,Male,No,2,0 +Bachelors,2015,New Delhi,3,26,Male,No,4,0 +Bachelors,2017,New Delhi,3,28,Female,No,1,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Masters,2014,Bangalore,3,28,Male,No,1,1 +Bachelors,2015,Bangalore,3,29,Male,No,1,0 +Bachelors,2017,New Delhi,3,27,Female,No,5,0 +Bachelors,2012,Bangalore,3,27,Male,Yes,5,0 +Masters,2017,New Delhi,2,30,Male,No,2,0 +Bachelors,2015,Bangalore,3,28,Female,No,2,0 +Masters,2017,Bangalore,1,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,27,Male,Yes,5,1 +Masters,2017,Pune,2,30,Male,No,1,0 +Bachelors,2013,Pune,3,29,Male,No,2,0 +Bachelors,2013,Pune,3,29,Male,No,2,0 +Bachelors,2012,Pune,3,27,Male,Yes,5,0 +Bachelors,2015,Pune,3,30,Female,No,1,1 +Bachelors,2015,Pune,2,29,Female,No,2,1 +Masters,2018,Pune,3,26,Male,No,4,1 +Masters,2013,Bangalore,2,29,Female,No,2,1 +Bachelors,2014,Bangalore,1,28,Male,No,2,1 +Bachelors,2015,Bangalore,3,30,Male,No,1,0 +Bachelors,2015,Pune,2,27,Female,No,5,1 +Bachelors,2014,Bangalore,3,28,Female,Yes,1,0 +Masters,2015,New Delhi,3,27,Male,No,5,0 +Masters,2017,New Delhi,2,26,Male,No,4,1 +Bachelors,2018,Bangalore,3,28,Male,No,1,1 +Bachelors,2015,New Delhi,3,28,Female,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Pune,1,26,Female,No,4,1 +Masters,2017,New Delhi,2,30,Male,Yes,2,0 +Bachelors,2015,Bangalore,3,28,Female,No,1,0 +Bachelors,2013,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,1 +Bachelors,2018,Bangalore,3,28,Male,No,2,1 +Masters,2017,New Delhi,2,28,Male,No,2,0 +Bachelors,2015,Bangalore,3,29,Male,No,2,0 +Bachelors,2012,New Delhi,3,30,Male,No,1,1 +Masters,2016,Pune,3,30,Male,No,1,0 +Bachelors,2014,Pune,3,30,Male,No,1,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Masters,2017,Bangalore,3,26,Male,No,4,1 +Bachelors,2012,New Delhi,3,27,Female,No,5,0 +Bachelors,2018,Bangalore,3,26,Female,Yes,4,1 +PHD,2014,Bangalore,3,27,Male,No,5,0 +Masters,2017,New Delhi,2,26,Male,Yes,4,1 +Bachelors,2013,Bangalore,3,30,Female,No,1,1 +Bachelors,2012,Bangalore,3,30,Female,No,2,0 +Masters,2018,New Delhi,3,26,Male,Yes,4,1 +Bachelors,2013,Bangalore,1,28,Female,No,1,0 +Bachelors,2017,Bangalore,3,30,Male,No,1,0 +Masters,2017,Pune,2,30,Female,No,2,1 +PHD,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,New Delhi,3,28,Female,No,2,0 +Bachelors,2015,Pune,2,29,Female,No,1,1 +Bachelors,2013,Bangalore,3,27,Female,No,5,0 +Masters,2014,Pune,3,27,Male,No,5,0 +Masters,2017,New Delhi,2,26,Female,Yes,4,1 +Masters,2017,New Delhi,2,30,Female,No,1,0 +Masters,2018,New Delhi,3,27,Female,No,5,1 +Bachelors,2017,Pune,2,29,Male,No,1,0 +Masters,2014,New Delhi,1,29,Male,No,1,0 +Bachelors,2015,Pune,2,30,Female,No,2,1 +Bachelors,2014,Bangalore,3,30,Male,No,2,1 +Masters,2018,New Delhi,1,30,Female,No,2,0 +Bachelors,2017,Bangalore,3,29,Male,No,1,0 +Bachelors,2016,Pune,3,28,Male,No,2,0 +Bachelors,2018,Bangalore,3,26,Female,No,4,1 +Bachelors,2014,Bangalore,1,28,Female,No,2,0 +Masters,2017,New Delhi,2,29,Female,No,2,0 +Masters,2013,New Delhi,3,26,Male,No,4,1 +Bachelors,2017,New Delhi,2,28,Female,No,1,0 +Bachelors,2016,Bangalore,3,30,Female,No,1,0 +PHD,2015,Pune,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,29,Male,No,2,0 +Bachelors,2014,Pune,2,28,Female,No,2,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Masters,2017,New Delhi,2,30,Female,Yes,2,0 +PHD,2013,New Delhi,3,30,Female,No,2,0 +Bachelors,2015,Bangalore,3,29,Male,No,2,0 +Bachelors,2017,Bangalore,3,28,Male,No,2,0 +Bachelors,2015,Bangalore,3,29,Male,No,2,1 +Bachelors,2015,Pune,1,26,Female,No,4,1 +Bachelors,2013,Bangalore,3,28,Male,No,1,0 +Bachelors,2015,Pune,2,29,Female,No,2,1 +Bachelors,2013,Bangalore,3,26,Male,Yes,4,0 +Masters,2014,Pune,3,30,Male,No,2,0 +Masters,2017,Pune,2,30,Male,Yes,2,0 +Bachelors,2017,Pune,3,27,Male,No,5,0 +Bachelors,2014,New Delhi,3,28,Female,Yes,2,0 +Bachelors,2014,New Delhi,3,27,Female,No,5,0 +Bachelors,2015,Pune,2,29,Female,Yes,1,1 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Bachelors,2014,New Delhi,3,30,Male,No,1,0 +Bachelors,2013,Pune,2,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Masters,2017,New Delhi,2,27,Male,No,5,1 +Bachelors,2017,Pune,2,29,Female,No,1,1 +Masters,2017,New Delhi,2,28,Female,No,1,1 +Bachelors,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,29,Female,No,1,1 +Bachelors,2012,Bangalore,3,28,Male,No,1,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,28,Female,No,1,0 +Masters,2015,Pune,2,30,Female,No,2,1 +Masters,2017,New Delhi,2,28,Male,No,2,0 +Masters,2015,Pune,2,29,Female,No,1,0 +Masters,2015,Bangalore,3,26,Male,No,4,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,29,Female,No,1,0 +Bachelors,2017,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2014,New Delhi,3,29,Female,No,2,0 +Bachelors,2017,New Delhi,3,27,Female,No,5,0 +Masters,2017,Pune,2,28,Female,No,2,0 +Masters,2013,New Delhi,3,27,Female,No,5,1 +Masters,2017,New Delhi,3,27,Male,Yes,5,1 +Bachelors,2013,Bangalore,3,30,Male,No,2,0 +Bachelors,2015,Pune,2,27,Female,Yes,5,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,2,27,Female,No,5,1 +Bachelors,2015,Bangalore,3,30,Male,No,2,1 +Masters,2017,Bangalore,2,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,30,Male,No,2,1 +Bachelors,2016,Pune,2,30,Female,No,2,1 +Masters,2016,Pune,1,27,Female,No,5,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Pune,3,29,Female,No,2,1 +Bachelors,2013,New Delhi,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,29,Female,No,2,1 +Bachelors,2013,Pune,3,28,Male,No,2,0 +Bachelors,2013,Pune,2,27,Male,No,5,1 +Masters,2014,New Delhi,3,28,Male,No,1,1 +Bachelors,2016,New Delhi,3,27,Female,No,5,1 +Bachelors,2016,New Delhi,3,29,Female,Yes,2,0 +Masters,2018,New Delhi,1,26,Female,No,4,1 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Bachelors,2013,Pune,2,27,Female,No,5,1 +Bachelors,2014,New Delhi,3,28,Female,No,2,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,29,Female,No,1,0 +Bachelors,2012,Bangalore,3,29,Female,No,1,0 +Bachelors,2018,Bangalore,3,29,Male,Yes,2,1 +Bachelors,2012,Pune,3,30,Male,No,1,0 +Bachelors,2013,Bangalore,3,30,Male,Yes,1,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,New Delhi,3,29,Female,Yes,1,0 +Bachelors,2014,Bangalore,3,30,Female,No,1,0 +Bachelors,2014,Pune,1,28,Male,No,2,0 +Bachelors,2015,Pune,3,27,Female,No,5,0 +Bachelors,2016,Bangalore,3,30,Male,No,1,1 +Bachelors,2016,Pune,3,26,Female,No,4,1 +Bachelors,2018,New Delhi,3,27,Female,Yes,5,1 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Masters,2017,New Delhi,2,27,Male,No,5,1 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Pune,3,26,Female,No,4,1 +Bachelors,2012,Pune,1,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +PHD,2017,Bangalore,3,28,Female,No,1,0 +Bachelors,2015,Pune,3,29,Female,No,1,1 +Masters,2014,New Delhi,3,30,Male,Yes,2,0 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Pune,3,28,Male,No,1,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,New Delhi,3,26,Male,No,4,0 +Masters,2012,New Delhi,3,30,Male,No,2,0 +PHD,2013,New Delhi,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,30,Male,Yes,1,1 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Masters,2017,New Delhi,3,29,Female,No,2,0 +Bachelors,2014,Bangalore,3,29,Male,No,2,0 +Bachelors,2017,New Delhi,3,28,Male,No,1,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2018,Bangalore,3,27,Female,No,5,1 +Bachelors,2014,Bangalore,1,28,Male,No,1,0 +Bachelors,2016,Bangalore,3,28,Male,No,1,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2012,Pune,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,28,Male,No,2,0 +Bachelors,2014,Bangalore,3,28,Male,No,1,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +PHD,2012,New Delhi,1,29,Female,No,2,0 +Bachelors,2013,Bangalore,3,30,Female,No,2,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Pune,3,28,Male,No,1,0 +Masters,2013,New Delhi,2,26,Male,No,4,1 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Pune,3,27,Female,No,5,0 +PHD,2015,New Delhi,3,28,Male,No,2,0 +Masters,2017,Pune,2,28,Male,No,2,0 +Bachelors,2014,Pune,3,28,Male,No,4,0 +Bachelors,2016,Bangalore,3,29,Female,No,1,1 +Bachelors,2017,Bangalore,3,26,Female,No,4,1 +Bachelors,2015,Bangalore,3,30,Male,No,0,0 +Masters,2012,New Delhi,3,30,Male,No,2,0 +Bachelors,2012,Bangalore,1,30,Female,No,0,0 +Bachelors,2014,New Delhi,3,27,Female,No,5,0 +Bachelors,2017,New Delhi,2,28,Female,No,0,0 +Bachelors,2012,Pune,3,26,Male,No,4,0 +Bachelors,2015,Pune,3,29,Female,No,3,1 +Masters,2017,Pune,2,30,Male,No,0,1 +Bachelors,2013,New Delhi,3,26,Male,No,4,0 +Masters,2014,Pune,3,30,Male,No,0,1 +Bachelors,2013,Pune,3,29,Male,Yes,2,0 +Bachelors,2017,Bangalore,3,28,Male,No,3,0 +Masters,2018,New Delhi,3,27,Male,Yes,5,1 +Masters,2017,New Delhi,2,26,Female,Yes,4,1 +Bachelors,2012,Bangalore,3,30,Female,No,0,1 +Bachelors,2012,Bangalore,3,29,Female,No,4,0 +Bachelors,2014,Bangalore,3,29,Male,No,1,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,28,Male,Yes,4,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Pune,3,29,Male,No,5,0 +Bachelors,2014,Bangalore,3,29,Male,No,0,0 +Masters,2013,Bangalore,3,30,Male,No,5,1 +Bachelors,2017,New Delhi,3,30,Female,Yes,3,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +PHD,2015,Pune,2,30,Female,No,4,0 +Masters,2014,Bangalore,3,30,Male,No,4,1 +Masters,2017,New Delhi,2,27,Male,No,5,1 +Bachelors,2013,Pune,3,30,Male,No,0,0 +Masters,2017,Pune,2,30,Male,No,0,0 +Masters,2017,New Delhi,2,29,Female,No,2,0 +Masters,2017,New Delhi,2,29,Male,No,2,0 +Bachelors,2014,Bangalore,1,27,Male,No,5,1 +Bachelors,2012,Bangalore,3,27,Female,No,5,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Masters,2018,New Delhi,3,30,Female,No,4,1 +Bachelors,2015,Bangalore,3,29,Female,No,1,0 +Bachelors,2014,Pune,3,26,Female,No,4,1 +Masters,2016,Pune,3,28,Male,No,2,0 +Bachelors,2015,New Delhi,3,28,Female,No,4,0 +Bachelors,2015,Bangalore,3,30,Male,No,0,0 +Bachelors,2014,Bangalore,3,28,Female,No,3,0 +Bachelors,2017,Bangalore,3,28,Male,No,4,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,28,Female,No,0,0 +Bachelors,2015,Pune,2,28,Female,No,2,1 +Masters,2013,Pune,3,27,Female,Yes,5,1 +Bachelors,2016,Bangalore,3,27,Male,No,5,1 +Bachelors,2012,Pune,3,29,Male,No,1,0 +Bachelors,2015,Pune,2,28,Female,No,0,1 +Bachelors,2018,Pune,3,30,Male,Yes,3,1 +Bachelors,2016,Bangalore,3,29,Male,No,5,0 +Masters,2013,New Delhi,2,27,Female,No,5,1 +Masters,2017,New Delhi,2,30,Male,No,2,0 +Bachelors,2012,New Delhi,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,30,Male,No,2,1 +Bachelors,2017,New Delhi,2,29,Male,No,3,1 +Bachelors,2017,Pune,2,28,Male,No,3,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,29,Male,Yes,4,0 +Bachelors,2013,Bangalore,3,30,Male,No,5,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2012,Bangalore,3,29,Male,Yes,2,1 +Masters,2015,Bangalore,3,28,Male,No,0,1 +Bachelors,2014,New Delhi,3,29,Female,No,2,0 +Masters,2015,Pune,3,29,Female,No,4,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Pune,3,27,Female,No,5,1 +Bachelors,2017,Bangalore,3,30,Male,No,1,1 +Masters,2014,Pune,3,30,Male,No,2,0 +Bachelors,2015,New Delhi,3,28,Female,No,4,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Bachelors,2014,Bangalore,3,28,Male,No,5,0 +Bachelors,2017,Bangalore,1,28,Female,No,0,1 +Bachelors,2016,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2013,Bangalore,3,28,Male,No,5,0 +Masters,2013,New Delhi,3,30,Male,No,2,1 +Masters,2013,New Delhi,1,29,Female,No,2,1 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Pune,3,28,Male,No,3,0 +Bachelors,2013,Bangalore,3,29,Male,No,2,0 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Masters,2017,New Delhi,2,30,Female,No,2,0 +PHD,2013,New Delhi,3,27,Female,No,5,0 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2016,Bangalore,3,28,Female,No,1,1 +Bachelors,2017,Pune,2,27,Female,No,5,1 +Bachelors,2012,Bangalore,3,27,Female,No,5,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,1 +Bachelors,2016,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Bachelors,2015,Pune,3,29,Male,No,1,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Bachelors,2017,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2015,Pune,3,30,Female,No,0,1 +Bachelors,2017,Bangalore,3,30,Male,No,3,0 +PHD,2012,New Delhi,3,29,Male,No,5,0 +Bachelors,2016,Pune,3,29,Male,No,5,0 +Bachelors,2014,Bangalore,3,26,Female,Yes,4,0 +PHD,2014,New Delhi,3,28,Female,No,0,0 +Bachelors,2018,Bangalore,3,28,Male,No,1,1 +Bachelors,2013,New Delhi,3,27,Female,Yes,5,0 +Bachelors,2013,Bangalore,3,28,Male,No,2,0 +Bachelors,2018,Bangalore,3,29,Male,No,0,1 +Bachelors,2016,Bangalore,3,29,Male,No,3,0 +Bachelors,2018,Pune,3,30,Female,No,2,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Pune,3,29,Male,No,3,0 +Bachelors,2013,Pune,3,30,Male,No,4,0 +Masters,2015,New Delhi,3,29,Male,No,2,0 +Bachelors,2018,Pune,3,27,Male,No,5,1 +Bachelors,2016,Bangalore,3,28,Male,No,2,0 +Bachelors,2015,Bangalore,3,29,Male,No,1,0 +Bachelors,2016,Bangalore,3,30,Male,No,0,0 +Bachelors,2016,Bangalore,3,28,Female,No,1,0 +Bachelors,2017,New Delhi,3,26,Female,No,4,0 +Bachelors,2014,Pune,2,29,Female,No,1,1 +PHD,2013,New Delhi,3,30,Female,No,2,0 +Bachelors,2016,Bangalore,3,28,Male,Yes,3,0 +Bachelors,2015,Bangalore,3,28,Male,No,1,0 +Bachelors,2016,Pune,3,28,Male,No,5,0 +Bachelors,2017,Pune,2,28,Female,No,1,1 +Bachelors,2015,Bangalore,3,30,Male,No,4,0 +Masters,2012,New Delhi,3,27,Male,No,5,0 +Masters,2017,New Delhi,3,29,Female,Yes,2,0 +Bachelors,2018,New Delhi,3,29,Female,No,2,1 +Bachelors,2018,Bangalore,3,29,Male,No,0,1 +Bachelors,2012,Bangalore,3,28,Female,No,0,0 +Bachelors,2015,Pune,2,28,Female,No,0,1 +Masters,2017,New Delhi,2,27,Female,No,5,1 +Bachelors,2018,Pune,3,28,Female,No,5,1 +Bachelors,2016,Pune,3,28,Male,No,1,0 +Bachelors,2014,Bangalore,1,26,Male,No,4,1 +Bachelors,2014,New Delhi,2,29,Female,No,3,1 +Masters,2014,Pune,3,26,Male,No,4,1 +Bachelors,2017,Pune,3,27,Male,No,5,0 +Bachelors,2013,Pune,3,30,Male,No,4,1 +Bachelors,2015,Bangalore,3,30,Male,No,3,0 +Bachelors,2012,Bangalore,3,29,Male,No,2,1 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2017,New Delhi,2,30,Female,No,2,1 +Bachelors,2012,Pune,3,29,Male,No,0,0 +Bachelors,2015,Pune,1,30,Female,No,0,1 +Bachelors,2017,Bangalore,3,28,Male,No,3,0 +Bachelors,2013,Bangalore,3,28,Male,No,5,0 +Bachelors,2017,Pune,2,30,Female,No,4,1 +Bachelors,2017,Pune,2,28,Male,No,5,0 +Bachelors,2014,New Delhi,3,27,Female,No,5,1 +Bachelors,2012,Bangalore,3,28,Female,No,2,0 +Bachelors,2013,Bangalore,3,29,Female,No,5,0 +Bachelors,2012,Bangalore,3,27,Female,No,5,1 +Bachelors,2017,Pune,2,28,Female,No,3,1 +Bachelors,2015,Bangalore,1,29,Male,No,4,0 +Bachelors,2013,Bangalore,2,30,Male,No,0,1 +PHD,2018,Bangalore,3,28,Male,No,2,1 +Bachelors,2015,Pune,3,28,Female,No,3,1 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,30,Female,No,3,1 +Bachelors,2012,Bangalore,3,29,Male,No,5,0 +Bachelors,2012,Bangalore,3,27,Female,No,5,0 +Bachelors,2015,Bangalore,3,26,Female,No,4,0 +Bachelors,2016,Pune,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,27,Female,No,5,0 +Bachelors,2013,Pune,3,28,Male,No,0,0 +Bachelors,2014,Pune,3,29,Male,No,1,0 +Bachelors,2017,New Delhi,2,27,Male,No,5,0 +Bachelors,2013,New Delhi,3,27,Female,No,5,0 +Bachelors,2017,Pune,3,30,Male,No,5,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2012,New Delhi,3,30,Female,Yes,3,0 +Bachelors,2013,Pune,2,30,Male,No,1,1 +PHD,2015,New Delhi,3,27,Female,No,5,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,27,Female,Yes,5,1 +Masters,2017,New Delhi,2,29,Male,No,1,0 +Bachelors,2013,New Delhi,3,28,Female,No,3,0 +Masters,2012,Pune,3,29,Male,No,4,1 +Bachelors,2014,New Delhi,3,28,Female,No,3,0 +Bachelors,2018,Bangalore,3,27,Male,Yes,5,1 +Bachelors,2012,Bangalore,3,29,Male,No,1,0 +Bachelors,2017,Pune,2,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,30,Male,No,2,1 +Bachelors,2014,New Delhi,3,29,Male,No,4,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Bachelors,2014,Bangalore,3,27,Female,No,5,0 +Masters,2013,New Delhi,2,26,Male,No,4,1 +Bachelors,2013,New Delhi,3,29,Female,No,2,0 +Bachelors,2016,Bangalore,2,30,Female,No,4,1 +Bachelors,2017,New Delhi,3,29,Female,No,0,0 +Bachelors,2018,Bangalore,3,28,Male,No,3,1 +Bachelors,2014,Bangalore,3,29,Male,No,4,0 +Masters,2017,New Delhi,2,30,Female,No,2,0 +Bachelors,2018,Bangalore,3,29,Male,Yes,2,1 +Bachelors,2017,New Delhi,2,28,Female,No,1,0 +Bachelors,2013,Bangalore,2,27,Female,No,5,1 +Bachelors,2015,Bangalore,3,30,Male,No,4,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Masters,2017,Bangalore,2,30,Male,No,3,0 +Masters,2017,New Delhi,2,29,Male,No,4,0 +Bachelors,2014,Bangalore,3,28,Male,No,3,0 +Masters,2017,New Delhi,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,3,27,Male,No,5,0 +Bachelors,2016,Pune,3,30,Male,No,0,0 +Bachelors,2015,Bangalore,3,29,Female,No,0,0 +Bachelors,2015,Pune,2,27,Female,Yes,5,1 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Bachelors,2015,New Delhi,3,29,Male,No,1,0 +Bachelors,2017,Bangalore,3,30,Male,No,4,0 +PHD,2017,New Delhi,3,27,Male,No,5,0 +PHD,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,28,Male,Yes,1,1 +Bachelors,2013,Bangalore,3,29,Male,No,1,0 +Masters,2017,Pune,2,29,Female,Yes,2,1 +Bachelors,2015,Pune,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,27,Female,No,5,0 +Masters,2018,Pune,3,26,Male,No,4,1 +Bachelors,2012,New Delhi,1,27,Female,No,5,1 +Masters,2017,Pune,2,27,Male,Yes,5,1 +Bachelors,2015,Pune,1,28,Female,No,0,1 +Bachelors,2014,Bangalore,3,29,Male,No,4,1 +Bachelors,2017,New Delhi,3,29,Female,No,3,0 +PHD,2015,Pune,2,26,Female,No,4,0 +Bachelors,2017,Bangalore,3,30,Female,No,5,0 +Bachelors,2016,Pune,3,26,Male,No,4,0 +Masters,2013,Pune,3,26,Male,No,4,1 +Bachelors,2012,Pune,2,29,Female,No,2,1 +Bachelors,2018,Bangalore,3,30,Male,Yes,2,1 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2018,Bangalore,2,28,Female,No,3,1 +Bachelors,2012,Bangalore,3,28,Male,No,0,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,28,Female,Yes,0,0 +Masters,2014,New Delhi,3,28,Male,No,2,0 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Bachelors,2015,Pune,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,28,Male,Yes,2,0 +Bachelors,2018,Pune,3,29,Male,Yes,3,1 +Bachelors,2014,New Delhi,3,29,Male,Yes,4,0 +Bachelors,2015,Bangalore,3,29,Male,No,1,0 +Masters,2018,Bangalore,3,27,Male,Yes,5,1 +Bachelors,2014,Bangalore,3,28,Male,No,5,0 +Masters,2017,Pune,2,27,Male,No,5,0 +Bachelors,2017,Pune,2,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,28,Male,No,4,0 +Bachelors,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2017,Pune,3,29,Female,No,0,1 +Bachelors,2012,Bangalore,3,26,Female,No,4,0 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2017,Pune,2,26,Female,No,4,1 +Bachelors,2014,Bangalore,3,30,Male,No,1,0 +Bachelors,2018,Bangalore,3,29,Male,No,2,1 +Masters,2013,Bangalore,3,30,Male,No,2,1 +Bachelors,2016,Bangalore,3,27,Female,No,5,0 +Bachelors,2016,New Delhi,3,26,Female,No,4,0 +Bachelors,2017,Bangalore,1,30,Male,No,1,0 +Bachelors,2015,New Delhi,3,30,Female,Yes,1,0 +Bachelors,2013,Pune,3,30,Male,No,0,0 +Bachelors,2015,Pune,3,27,Male,No,5,0 +Bachelors,2017,Pune,3,30,Female,No,1,1 +PHD,2018,New Delhi,3,30,Male,No,2,1 +Bachelors,2018,Bangalore,3,29,Male,Yes,1,1 +Bachelors,2013,Bangalore,3,30,Male,Yes,0,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,1 +Bachelors,2016,New Delhi,3,29,Female,Yes,2,0 +Bachelors,2013,Pune,3,28,Male,No,5,0 +Bachelors,2014,New Delhi,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,30,Female,No,1,1 +Masters,2013,New Delhi,2,26,Male,No,4,1 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Masters,2012,Pune,3,27,Male,Yes,5,1 +Bachelors,2017,Bangalore,3,27,Female,No,5,0 +Bachelors,2013,Bangalore,3,30,Male,No,1,0 +Bachelors,2014,New Delhi,3,27,Male,No,5,0 +Masters,2013,Bangalore,3,30,Male,No,1,1 +Bachelors,2016,Bangalore,3,29,Male,No,2,1 +Bachelors,2016,Bangalore,3,28,Male,No,3,0 +Masters,2017,New Delhi,3,29,Female,No,2,0 +Bachelors,2014,New Delhi,3,26,Male,No,4,0 +Masters,2018,New Delhi,3,30,Male,No,2,1 +Masters,2014,Pune,3,27,Female,No,5,1 +Bachelors,2017,Pune,3,29,Male,No,0,0 +Masters,2016,New Delhi,3,30,Male,No,2,0 +Masters,2017,New Delhi,3,30,Male,No,3,1 +Bachelors,2013,Pune,2,30,Female,No,1,1 +Masters,2014,New Delhi,3,28,Female,No,3,0 +Bachelors,2013,Pune,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,1,30,Male,No,2,0 +Bachelors,2016,Bangalore,3,28,Male,Yes,3,0 +Bachelors,2013,Pune,1,30,Female,Yes,1,1 +Bachelors,2013,Bangalore,3,30,Female,No,5,0 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Pune,3,27,Male,No,5,0 +Masters,2012,New Delhi,3,26,Female,No,4,0 +Bachelors,2013,Pune,2,26,Male,Yes,4,0 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +PHD,2018,New Delhi,2,30,Female,No,4,1 +Bachelors,2017,Bangalore,3,29,Male,No,3,0 +Bachelors,2013,Bangalore,3,28,Male,No,1,0 +Bachelors,2012,Bangalore,3,28,Male,Yes,2,0 +Masters,2017,New Delhi,1,30,Male,No,2,0 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Masters,2013,Bangalore,1,29,Female,No,2,1 +Bachelors,2012,Pune,3,29,Male,No,5,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,29,Male,No,4,0 +Bachelors,2014,Bangalore,3,29,Male,No,3,1 +Bachelors,2018,Bangalore,3,28,Male,No,0,1 +Bachelors,2012,Bangalore,3,27,Male,No,5,1 +Bachelors,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2014,Pune,2,29,Female,No,1,1 +Bachelors,2017,Bangalore,3,29,Male,No,4,0 +Bachelors,2015,Pune,2,28,Female,No,3,1 +Bachelors,2017,Bangalore,3,28,Male,No,5,0 +Bachelors,2017,Bangalore,3,29,Male,No,0,0 +Bachelors,2017,Bangalore,3,30,Male,No,2,0 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Masters,2017,New Delhi,2,30,Female,No,2,0 +Bachelors,2015,Pune,2,29,Female,No,4,1 +Bachelors,2014,Pune,3,29,Female,No,1,1 +Bachelors,2012,Bangalore,3,28,Male,No,2,0 +Bachelors,2012,Bangalore,3,28,Female,No,4,0 +Bachelors,2017,Bangalore,3,29,Female,No,5,0 +Bachelors,2015,Bangalore,3,30,Male,Yes,3,0 +Masters,2012,Pune,3,26,Male,No,4,1 +Bachelors,2018,Bangalore,3,28,Male,No,5,1 +Bachelors,2017,New Delhi,3,30,Male,No,5,0 +Bachelors,2012,New Delhi,3,27,Female,No,5,0 +Bachelors,2017,New Delhi,3,26,Female,No,4,0 +Bachelors,2014,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2014,Bangalore,3,30,Male,No,0,0 +Bachelors,2014,New Delhi,3,30,Female,No,2,0 +Bachelors,2012,New Delhi,3,29,Female,No,5,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Pune,2,29,Female,No,4,1 +Masters,2016,Pune,3,29,Male,No,4,1 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Masters,2017,New Delhi,3,26,Female,No,4,0 +Masters,2012,New Delhi,3,29,Male,No,2,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,0 +Bachelors,2012,Pune,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,28,Female,No,2,1 +Bachelors,2013,New Delhi,3,30,Female,No,3,1 +Masters,2017,Pune,2,26,Female,No,4,1 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2017,New Delhi,2,28,Female,No,2,0 +Bachelors,2017,New Delhi,2,27,Male,No,5,0 +PHD,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2013,Bangalore,3,30,Female,No,1,0 +Masters,2013,New Delhi,3,30,Male,No,0,1 +Masters,2018,New Delhi,3,26,Female,No,4,1 +Masters,2015,New Delhi,3,30,Male,No,2,0 +Bachelors,2012,Bangalore,3,29,Male,No,4,0 +Bachelors,2018,Bangalore,3,27,Male,Yes,5,1 +Masters,2017,Pune,2,28,Male,No,5,0 +Bachelors,2016,Pune,2,29,Male,No,3,1 +Bachelors,2015,Pune,2,27,Female,Yes,5,1 +Bachelors,2014,Bangalore,3,29,Male,No,4,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Pune,3,28,Male,No,5,1 +Bachelors,2012,Bangalore,3,28,Female,No,0,0 +Masters,2017,Pune,2,28,Male,No,2,0 +Masters,2015,Pune,2,27,Female,No,5,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Bachelors,2014,Pune,3,29,Female,No,4,1 +Masters,2016,New Delhi,3,30,Male,No,3,0 +Bachelors,2014,Pune,1,26,Female,No,4,1 +Bachelors,2012,Pune,2,27,Female,No,5,1 +Bachelors,2017,Pune,3,30,Male,No,0,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,2,30,Male,No,4,0 +Bachelors,2017,New Delhi,2,28,Female,No,4,0 +PHD,2016,Bangalore,3,30,Female,No,5,0 +Bachelors,2018,Bangalore,3,28,Male,No,1,1 +Bachelors,2017,Pune,2,29,Male,No,3,0 +Bachelors,2017,New Delhi,2,30,Male,No,1,1 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Pune,3,30,Male,No,0,0 +Bachelors,2018,Bangalore,3,26,Male,Yes,4,1 +Bachelors,2015,New Delhi,3,28,Female,No,3,0 +Masters,2017,New Delhi,2,26,Female,Yes,4,1 +Bachelors,2016,Pune,2,30,Female,No,1,1 +Masters,2014,New Delhi,3,28,Male,No,0,0 +Bachelors,2015,Bangalore,3,28,Male,No,2,0 +Masters,2015,Pune,2,30,Female,No,1,0 +Masters,2017,New Delhi,2,27,Female,No,5,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Pune,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,30,Male,No,1,1 +Masters,2017,New Delhi,3,29,Male,No,2,0 +Bachelors,2012,Bangalore,3,30,Female,No,1,0 +Bachelors,2018,Bangalore,3,29,Male,No,3,1 +Masters,2018,Pune,3,29,Male,No,2,1 +Bachelors,2016,Bangalore,3,27,Female,No,5,0 +Bachelors,2017,New Delhi,2,28,Male,No,2,0 +Bachelors,2016,Bangalore,3,29,Female,No,0,1 +Bachelors,2016,New Delhi,1,29,Female,No,1,0 +Bachelors,2015,Pune,2,28,Female,No,0,1 +Bachelors,2012,Bangalore,3,29,Male,Yes,2,0 +PHD,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2018,Bangalore,3,29,Female,No,3,1 +Masters,2017,New Delhi,2,30,Male,No,2,0 +Masters,2016,New Delhi,3,29,Female,No,1,1 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Pune,3,28,Male,No,5,0 +Bachelors,2017,New Delhi,2,29,Female,No,5,0 +Bachelors,2014,Bangalore,3,30,Male,No,0,0 +Bachelors,2017,Bangalore,3,30,Male,No,0,0 +Bachelors,2014,Pune,3,28,Male,No,2,0 +Bachelors,2013,New Delhi,3,28,Female,No,1,0 +Bachelors,2016,New Delhi,3,26,Female,No,4,0 +Bachelors,2012,New Delhi,3,28,Female,No,0,0 +Bachelors,2017,Bangalore,3,29,Male,No,0,0 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +Masters,2017,New Delhi,2,26,Male,No,4,1 +Bachelors,2017,New Delhi,3,26,Female,No,4,0 +Bachelors,2013,Bangalore,3,27,Male,No,5,1 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,Pune,2,29,Female,No,0,1 +Bachelors,2013,Pune,2,28,Female,No,4,1 +Bachelors,2017,Bangalore,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,28,Female,No,0,1 +Bachelors,2017,Bangalore,3,29,Male,No,1,0 +Bachelors,2013,Bangalore,3,29,Female,No,3,0 +Bachelors,2015,Bangalore,3,29,Male,No,5,0 +Bachelors,2017,New Delhi,3,30,Female,No,3,0 +Bachelors,2015,Pune,3,29,Male,No,0,0 +Bachelors,2013,Bangalore,3,27,Female,Yes,5,0 +Bachelors,2016,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,1 +Bachelors,2012,Bangalore,3,28,Male,No,2,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2018,Bangalore,3,29,Male,No,0,1 +Bachelors,2017,Bangalore,1,29,Female,No,5,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Masters,2017,Bangalore,2,27,Male,No,5,1 +Masters,2014,New Delhi,3,28,Female,No,2,0 +Bachelors,2012,New Delhi,3,27,Female,No,5,1 +Bachelors,2012,Bangalore,3,28,Male,No,0,0 +Masters,2017,Pune,2,27,Male,No,5,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,New Delhi,3,27,Female,No,5,1 +Bachelors,2013,Bangalore,2,26,Female,No,4,1 +Bachelors,2012,Pune,2,27,Female,No,5,1 +Bachelors,2016,Pune,3,26,Female,No,4,1 +Bachelors,2017,New Delhi,2,27,Male,No,5,0 +Bachelors,2012,Bangalore,3,28,Female,No,3,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Masters,2017,New Delhi,3,27,Male,No,5,0 +Bachelors,2013,Pune,2,30,Female,No,5,1 +Bachelors,2013,Pune,3,28,Male,No,0,0 +Bachelors,2012,Pune,3,26,Male,No,4,0 +Bachelors,2016,Bangalore,3,28,Male,No,3,1 +Masters,2015,Pune,3,26,Male,No,4,1 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Masters,2017,Bangalore,2,26,Male,No,4,1 +Bachelors,2014,Bangalore,3,30,Female,No,2,0 +Bachelors,2014,Bangalore,3,29,Female,No,2,0 +Bachelors,2017,Pune,3,26,Male,Yes,4,0 +Bachelors,2013,Bangalore,3,28,Male,No,0,0 +Bachelors,2018,Bangalore,3,29,Male,No,1,1 +Bachelors,2016,Bangalore,3,30,Female,No,3,0 +Bachelors,2017,Bangalore,3,30,Male,No,0,1 +PHD,2015,New Delhi,3,29,Male,No,4,0 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Bachelors,2014,Bangalore,1,28,Female,No,5,0 +Bachelors,2014,Pune,3,30,Male,No,0,0 +Masters,2012,Bangalore,3,26,Female,No,4,1 +Bachelors,2013,New Delhi,2,26,Female,No,4,1 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2016,New Delhi,3,29,Female,No,0,0 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Masters,2018,New Delhi,3,28,Female,No,2,1 +PHD,2015,New Delhi,2,27,Female,No,5,0 +Masters,2013,Pune,1,30,Male,No,1,0 +Bachelors,2012,Pune,3,26,Male,No,4,0 +Bachelors,2015,Pune,2,26,Female,Yes,4,1 +Bachelors,2018,New Delhi,3,30,Female,Yes,3,1 +PHD,2013,New Delhi,3,30,Male,No,5,0 +Bachelors,2013,Bangalore,3,28,Male,No,0,0 +Masters,2014,New Delhi,3,26,Male,Yes,4,1 +Bachelors,2017,Bangalore,3,29,Male,No,1,0 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2012,Pune,3,26,Male,No,4,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2015,Pune,3,29,Male,No,0,0 +Bachelors,2014,Bangalore,1,26,Male,No,4,0 +Bachelors,2018,Bangalore,3,36,Male,No,2,1 +Bachelors,2018,Bangalore,3,37,Male,No,4,1 +Bachelors,2015,Pune,3,35,Female,No,0,1 +Bachelors,2013,Pune,2,32,Female,No,4,1 +Bachelors,2013,Pune,1,39,Female,No,0,1 +Bachelors,2018,Pune,3,32,Male,No,1,1 +PHD,2012,New Delhi,3,37,Female,No,5,0 +Bachelors,2012,Pune,3,31,Male,No,4,0 +Bachelors,2018,Pune,3,31,Male,No,1,1 +Bachelors,2017,Bangalore,3,33,Male,No,2,0 +Masters,2017,Pune,2,37,Male,No,2,0 +Bachelors,2014,Pune,3,31,Male,Yes,1,0 +Masters,2017,Bangalore,3,40,Female,No,4,0 +Bachelors,2017,New Delhi,2,32,Male,No,0,0 +Bachelors,2016,Bangalore,3,41,Male,No,0,0 +Bachelors,2018,Bangalore,3,35,Female,Yes,5,1 +Bachelors,2014,Pune,3,34,Male,No,3,0 +Bachelors,2017,Bangalore,3,31,Male,No,0,0 +Masters,2017,Bangalore,3,41,Female,No,2,1 +Bachelors,2015,Pune,3,41,Male,No,5,0 +Bachelors,2016,Bangalore,3,37,Female,No,0,0 +Bachelors,2018,Bangalore,3,32,Female,No,3,1 +Bachelors,2015,Bangalore,3,37,Male,Yes,3,0 +Bachelors,2016,Bangalore,3,32,Male,No,1,0 +Masters,2017,New Delhi,3,36,Female,No,5,0 +Bachelors,2014,Bangalore,3,36,Male,No,3,0 +Bachelors,2015,Bangalore,3,36,Male,No,5,0 +Bachelors,2017,Bangalore,3,41,Male,Yes,3,0 +Bachelors,2015,Pune,3,39,Male,No,3,0 +Bachelors,2013,Pune,3,37,Male,No,0,0 +Bachelors,2013,Bangalore,3,32,Male,No,1,0 +Bachelors,2012,Bangalore,3,36,Male,No,2,0 +Bachelors,2013,Bangalore,3,36,Male,No,4,0 +Bachelors,2014,Bangalore,3,36,Male,No,1,0 +Bachelors,2018,Bangalore,3,32,Female,Yes,2,1 +Bachelors,2018,Bangalore,3,34,Male,No,3,1 +Bachelors,2018,Bangalore,3,37,Male,Yes,5,1 +Bachelors,2018,Pune,3,40,Male,Yes,3,1 +Bachelors,2014,Pune,2,36,Female,No,3,1 +Bachelors,2017,Pune,2,38,Female,No,0,0 +Masters,2017,New Delhi,2,31,Female,No,0,1 +Bachelors,2013,New Delhi,3,41,Female,No,4,0 +Masters,2012,Bangalore,2,32,Male,No,3,1 +Bachelors,2017,New Delhi,2,41,Female,No,3,0 +Bachelors,2013,Pune,3,40,Male,No,5,0 +Bachelors,2014,Bangalore,3,38,Female,No,2,1 +Masters,2017,New Delhi,2,36,Male,No,5,0 +Bachelors,2013,New Delhi,3,33,Female,No,1,0 +Bachelors,2014,Bangalore,3,39,Male,Yes,0,0 +Bachelors,2013,Bangalore,3,39,Male,No,0,0 +Bachelors,2014,Bangalore,3,33,Male,No,4,0 +Bachelors,2017,Pune,3,32,Male,No,5,0 +Bachelors,2014,Bangalore,3,35,Female,No,2,1 +Bachelors,2014,Bangalore,3,36,Male,No,5,0 +Bachelors,2018,Pune,2,39,Female,No,0,1 +Bachelors,2013,Bangalore,3,37,Female,No,5,0 +Masters,2017,New Delhi,2,35,Female,No,2,1 +Bachelors,2017,Bangalore,3,36,Male,No,5,0 +Masters,2013,New Delhi,3,41,Male,No,0,0 +Bachelors,2017,Bangalore,3,33,Male,No,2,0 +Bachelors,2018,Bangalore,3,38,Male,No,2,1 +Bachelors,2015,Bangalore,3,34,Male,No,5,0 +Bachelors,2012,Bangalore,3,34,Male,No,1,0 +Bachelors,2015,Pune,3,35,Male,Yes,5,0 +Bachelors,2012,Bangalore,3,39,Female,No,2,0 +Bachelors,2012,Bangalore,3,41,Male,No,3,0 +Bachelors,2018,Bangalore,3,34,Male,Yes,2,1 +Masters,2015,Pune,2,35,Female,No,1,0 +Bachelors,2012,Bangalore,3,33,Male,No,2,0 +Bachelors,2015,Bangalore,3,39,Male,No,3,0 +Masters,2017,New Delhi,2,35,Male,Yes,2,0 +Bachelors,2017,New Delhi,2,31,Female,No,0,0 +Bachelors,2016,Bangalore,3,34,Male,Yes,4,0 +Bachelors,2013,Bangalore,3,40,Female,Yes,5,0 +Bachelors,2016,New Delhi,3,31,Female,No,4,0 +Bachelors,2016,Pune,3,33,Male,No,3,0 +Bachelors,2013,Bangalore,3,32,Male,No,5,0 +Masters,2017,New Delhi,2,31,Male,No,4,1 +Bachelors,2014,Bangalore,3,39,Male,No,2,0 +Bachelors,2016,Bangalore,3,33,Male,No,1,1 +Bachelors,2014,Bangalore,3,40,Female,No,4,0 +Bachelors,2016,Bangalore,3,39,Male,No,0,1 +Bachelors,2017,Bangalore,3,35,Male,Yes,2,0 +Bachelors,2017,Bangalore,3,32,Male,No,1,0 +Bachelors,2015,Pune,2,34,Female,No,5,1 +Bachelors,2017,Bangalore,3,40,Female,No,4,0 +Masters,2017,Pune,3,33,Male,No,4,1 +Bachelors,2015,Pune,2,36,Female,No,0,1 +Masters,2018,Bangalore,3,39,Male,No,3,1 +Bachelors,2012,Bangalore,3,37,Female,No,5,1 +Bachelors,2018,Bangalore,3,36,Male,No,1,1 +Bachelors,2017,New Delhi,2,39,Male,No,2,0 +Bachelors,2015,Pune,2,35,Female,Yes,4,1 +Masters,2018,New Delhi,3,41,Male,No,2,1 +Bachelors,2012,Pune,3,31,Male,No,5,0 +Bachelors,2015,Pune,2,36,Female,Yes,0,1 +Bachelors,2016,Bangalore,3,32,Male,No,1,0 +Bachelors,2017,Bangalore,3,37,Male,No,2,1 +Bachelors,2015,Pune,2,39,Female,No,4,1 +Bachelors,2012,Pune,3,34,Male,No,2,0 +Bachelors,2012,Bangalore,3,35,Female,No,1,0 +Bachelors,2015,Bangalore,3,40,Female,No,2,0 +Bachelors,2016,Bangalore,3,39,Female,No,1,0 +Bachelors,2017,Bangalore,3,39,Female,No,1,0 +Bachelors,2015,Pune,3,41,Female,No,3,1 +Bachelors,2012,Pune,3,40,Male,No,2,0 +Bachelors,2012,Bangalore,1,36,Male,No,3,0 +Bachelors,2017,New Delhi,2,33,Female,No,2,0 +Masters,2014,New Delhi,3,33,Male,No,2,0 +Masters,2018,New Delhi,3,40,Male,No,2,1 +Bachelors,2015,Pune,2,34,Female,No,2,1 +Bachelors,2014,Bangalore,3,33,Female,No,1,0 +Masters,2015,New Delhi,1,34,Male,No,5,1 +Masters,2017,New Delhi,1,40,Male,No,5,0 +Bachelors,2014,Bangalore,3,32,Male,No,4,0 +Bachelors,2017,New Delhi,3,38,Male,No,2,0 +Bachelors,2015,Bangalore,3,38,Male,No,4,0 +Bachelors,2015,Bangalore,3,32,Male,No,2,0 +Bachelors,2013,Bangalore,3,31,Female,Yes,3,1 +Bachelors,2015,Bangalore,3,39,Female,No,0,0 +Masters,2017,Pune,2,41,Male,Yes,2,0 +Bachelors,2015,Pune,2,35,Female,Yes,2,1 +Bachelors,2016,Pune,3,39,Male,No,5,0 +Bachelors,2014,Bangalore,3,40,Female,No,0,0 +Bachelors,2016,Bangalore,3,41,Male,No,1,0 +Masters,2015,Pune,2,34,Female,No,1,0 +Bachelors,2016,Pune,2,37,Female,No,5,1 +Bachelors,2017,New Delhi,2,36,Male,No,2,0 +Bachelors,2015,Pune,3,37,Male,No,1,0 +Masters,2015,Pune,1,40,Female,No,1,0 +Bachelors,2018,New Delhi,3,39,Female,Yes,0,1 +Bachelors,2017,New Delhi,2,36,Female,No,5,0 +Bachelors,2015,Bangalore,2,32,Female,No,2,1 +PHD,2015,Pune,3,31,Female,No,1,0 +Bachelors,2012,Bangalore,3,31,Male,No,4,0 +Bachelors,2013,New Delhi,3,36,Female,No,5,0 +Bachelors,2014,Bangalore,3,35,Male,No,3,0 +Masters,2013,New Delhi,2,33,Female,No,2,1 +Bachelors,2014,Bangalore,3,39,Male,Yes,1,0 +Bachelors,2015,Pune,3,35,Female,No,1,1 +Bachelors,2013,Bangalore,3,38,Female,No,4,0 +Masters,2017,Bangalore,3,39,Female,No,4,1 +Bachelors,2012,Bangalore,3,41,Male,No,3,0 +Bachelors,2014,Pune,2,35,Male,No,2,1 +Bachelors,2016,Pune,3,31,Male,No,1,0 +Bachelors,2017,New Delhi,2,32,Female,No,4,1 +Bachelors,2016,New Delhi,3,34,Male,No,1,0 +Bachelors,2014,Bangalore,3,34,Male,Yes,3,0 +Masters,2014,New Delhi,3,36,Male,No,1,1 +Masters,2017,Bangalore,2,41,Male,No,4,0 +Masters,2017,Pune,2,39,Female,No,3,0 +Masters,2017,New Delhi,2,38,Male,No,5,0 +Bachelors,2012,Bangalore,3,37,Male,No,4,0 +Bachelors,2015,Bangalore,3,38,Male,No,3,1 +Bachelors,2014,Bangalore,3,37,Male,No,4,0 +Bachelors,2017,Bangalore,3,34,Male,No,5,0 +Bachelors,2014,Bangalore,1,39,Male,No,5,0 +Masters,2017,New Delhi,2,38,Female,No,2,1 +Masters,2017,New Delhi,3,33,Male,No,5,0 +Bachelors,2012,Bangalore,3,33,Female,No,5,0 +Bachelors,2012,Bangalore,3,34,Male,No,4,0 +Bachelors,2016,Pune,2,32,Female,No,0,1 +Bachelors,2012,Bangalore,3,33,Female,Yes,0,0 +Masters,2013,Pune,3,37,Male,No,2,0 +Masters,2015,New Delhi,3,37,Male,No,2,1 +Bachelors,2013,New Delhi,3,37,Male,No,2,0 +Bachelors,2017,Bangalore,3,40,Male,Yes,1,0 +Masters,2016,New Delhi,3,32,Male,No,1,0 +Bachelors,2016,Bangalore,3,36,Female,No,5,1 +Bachelors,2014,Bangalore,3,36,Male,No,4,0 +Bachelors,2014,Bangalore,3,36,Female,No,1,1 +Masters,2017,New Delhi,3,31,Male,No,1,1 +Bachelors,2015,Bangalore,3,38,Male,Yes,4,0 +Masters,2017,New Delhi,3,38,Male,No,2,0 +Bachelors,2012,Pune,3,39,Male,No,2,0 +Bachelors,2014,Bangalore,1,37,Male,No,5,0 +Bachelors,2015,Pune,2,36,Female,No,1,1 +Bachelors,2013,Bangalore,3,35,Male,No,2,1 +Bachelors,2013,Pune,3,40,Female,No,5,1 +Bachelors,2014,Pune,3,40,Male,No,5,0 +Bachelors,2017,Bangalore,3,35,Female,No,3,0 +Bachelors,2012,Bangalore,3,41,Female,No,5,0 +Bachelors,2015,Bangalore,3,32,Male,No,4,0 +Bachelors,2013,Bangalore,3,41,Male,No,2,0 +Bachelors,2016,New Delhi,3,40,Female,No,1,1 +Bachelors,2017,Pune,3,40,Male,No,3,0 +Bachelors,2017,Bangalore,3,34,Male,No,3,1 +Masters,2017,New Delhi,2,36,Male,Yes,2,0 +Bachelors,2017,New Delhi,3,33,Female,No,2,0 +Bachelors,2014,Pune,3,41,Male,No,2,0 +Bachelors,2014,Bangalore,3,40,Female,No,3,0 +Bachelors,2016,Bangalore,3,31,Male,No,1,1 +Masters,2015,Bangalore,3,32,Female,No,2,1 +Bachelors,2017,Pune,3,34,Female,No,1,1 +Bachelors,2016,New Delhi,3,32,Male,No,4,0 +Bachelors,2013,Bangalore,3,32,Female,No,4,0 +Bachelors,2014,Bangalore,3,38,Male,No,2,0 +Masters,2017,New Delhi,3,32,Male,No,1,1 +Bachelors,2015,New Delhi,3,40,Male,No,2,0 +Bachelors,2017,New Delhi,1,38,Female,No,1,1 +Bachelors,2017,Pune,3,37,Male,No,0,0 +PHD,2014,Bangalore,3,31,Male,No,1,0 +Bachelors,2014,Pune,3,34,Male,No,0,0 +Masters,2017,New Delhi,2,34,Female,No,2,1 +Bachelors,2013,Pune,2,37,Female,No,0,1 +Masters,2017,New Delhi,2,31,Male,No,1,0 +Bachelors,2017,Bangalore,3,35,Male,No,5,0 +PHD,2015,New Delhi,3,34,Female,No,4,0 +Bachelors,2012,Bangalore,1,32,Male,No,1,1 +Bachelors,2017,Pune,3,31,Male,Yes,0,0 +Bachelors,2015,Bangalore,3,36,Female,No,5,0 +Masters,2017,New Delhi,3,38,Female,No,2,0 +Bachelors,2015,Pune,3,34,Male,No,4,0 +Bachelors,2013,Bangalore,1,39,Female,No,1,1 +PHD,2013,Pune,3,35,Male,No,0,0 +Masters,2015,Pune,2,33,Male,No,4,1 +Masters,2014,Bangalore,3,35,Female,No,2,1 +Masters,2015,New Delhi,3,40,Male,No,2,0 +Bachelors,2015,Pune,2,32,Female,No,0,1 +Bachelors,2013,Bangalore,3,38,Male,No,1,0 +Bachelors,2012,Bangalore,3,32,Female,No,1,1 +Bachelors,2018,Bangalore,3,36,Male,No,3,1 +Bachelors,2012,Bangalore,3,35,Male,No,1,0 +Bachelors,2013,New Delhi,3,37,Female,No,0,0 +Bachelors,2015,Pune,2,35,Male,No,3,1 +Masters,2017,Pune,2,37,Female,No,1,0 +Masters,2017,Pune,2,39,Male,No,4,0 +Masters,2014,Pune,3,40,Male,No,4,1 +Bachelors,2012,Pune,2,41,Female,No,1,1 +Bachelors,2018,Pune,3,41,Male,Yes,0,1 +Masters,2017,Pune,2,39,Female,No,2,0 +Bachelors,2012,Bangalore,3,38,Female,No,5,0 +Bachelors,2013,Bangalore,3,33,Male,No,3,0 +Bachelors,2014,Bangalore,3,36,Female,No,3,0 +Bachelors,2017,Bangalore,3,41,Male,No,5,0 +PHD,2012,New Delhi,3,40,Female,No,5,0 +Bachelors,2013,Bangalore,3,31,Female,No,4,1 +Bachelors,2012,Bangalore,3,33,Female,No,1,0 +Bachelors,2015,Bangalore,3,39,Male,Yes,2,0 +Masters,2014,Pune,2,33,Female,No,5,0 +Bachelors,2015,Bangalore,3,35,Male,No,0,0 +Masters,2012,New Delhi,3,38,Male,No,2,0 +Bachelors,2016,Bangalore,3,36,Female,No,0,0 +Bachelors,2014,Pune,2,36,Female,No,2,1 +Bachelors,2015,Bangalore,1,35,Male,No,5,0 +Bachelors,2017,Pune,2,34,Female,No,5,1 +Bachelors,2015,Pune,2,41,Female,No,3,1 +Bachelors,2016,Pune,3,32,Female,No,3,1 +Bachelors,2017,Pune,2,41,Female,No,2,1 +Bachelors,2016,Bangalore,3,36,Male,No,0,0 +Bachelors,2017,Pune,2,39,Male,No,3,0 +Bachelors,2015,Bangalore,3,38,Male,Yes,2,0 +Bachelors,2014,Bangalore,3,34,Male,No,3,1 +Bachelors,2012,Bangalore,3,39,Female,No,5,0 +Bachelors,2017,Pune,3,36,Male,No,1,0 +Bachelors,2014,Bangalore,3,35,Male,No,1,0 +Masters,2018,Bangalore,3,31,Male,No,2,1 +Bachelors,2012,Bangalore,3,41,Female,No,4,0 +Bachelors,2017,Bangalore,3,35,Female,No,4,0 +Bachelors,2015,Bangalore,1,40,Male,No,2,0 +Bachelors,2018,Bangalore,3,33,Female,No,4,1 +Bachelors,2016,Bangalore,3,37,Female,No,0,0 +PHD,2018,Bangalore,3,36,Female,No,3,1 +Bachelors,2012,Bangalore,3,40,Male,No,0,0 +Bachelors,2017,New Delhi,2,36,Male,No,0,0 +Masters,2015,New Delhi,3,38,Female,No,0,0 +Bachelors,2014,New Delhi,2,31,Female,No,4,1 +Bachelors,2016,Pune,3,40,Male,No,4,0 +Bachelors,2017,Bangalore,3,37,Female,No,4,0 +Bachelors,2015,New Delhi,3,38,Female,No,0,0 +Masters,2017,New Delhi,2,35,Female,No,2,0 +PHD,2018,New Delhi,3,35,Female,No,0,1 +Bachelors,2012,Bangalore,3,38,Female,No,3,0 +Bachelors,2012,Pune,3,31,Female,No,5,0 +Masters,2016,New Delhi,3,33,Female,No,1,0 +Bachelors,2013,Pune,2,32,Female,No,1,1 +Bachelors,2017,Bangalore,1,39,Male,No,0,0 +Bachelors,2018,New Delhi,3,35,Female,No,2,1 +Bachelors,2014,New Delhi,3,38,Female,No,5,0 +Bachelors,2015,Bangalore,3,32,Male,No,0,0 +Bachelors,2017,Bangalore,3,34,Female,No,2,0 +Bachelors,2017,Bangalore,3,41,Male,No,1,0 +Masters,2012,Bangalore,3,40,Female,No,5,0 +Bachelors,2012,Pune,2,32,Male,No,1,1 +Bachelors,2013,Bangalore,3,35,Male,No,0,0 +PHD,2013,New Delhi,1,36,Female,No,3,0 +Bachelors,2013,Bangalore,3,40,Female,No,4,0 +Bachelors,2018,Pune,2,35,Female,No,2,1 +Masters,2017,New Delhi,2,37,Female,No,4,0 +Bachelors,2017,Bangalore,3,34,Male,No,3,0 +Bachelors,2012,Pune,3,36,Male,No,1,0 +Bachelors,2015,New Delhi,3,37,Male,No,4,0 +Bachelors,2014,Bangalore,3,39,Male,No,5,0 +Bachelors,2017,New Delhi,2,39,Female,No,0,0 +Masters,2018,New Delhi,3,38,Male,No,2,1 +Bachelors,2013,New Delhi,3,37,Female,No,1,0 +Bachelors,2012,New Delhi,2,33,Female,No,0,1 +PHD,2014,Bangalore,3,38,Female,No,3,0 +Masters,2017,New Delhi,2,40,Female,No,2,1 +Bachelors,2012,Bangalore,3,41,Male,No,5,0 +Bachelors,2013,Bangalore,2,38,Female,No,1,1 +Bachelors,2012,Bangalore,3,37,Male,No,4,0 +Bachelors,2014,Bangalore,3,39,Male,No,5,1 +Bachelors,2018,Bangalore,3,35,Male,No,1,1 +Masters,2017,New Delhi,3,39,Female,No,5,1 +Bachelors,2015,Pune,2,31,Female,No,1,1 +Bachelors,2012,Pune,3,33,Male,No,2,0 +Bachelors,2017,Pune,3,33,Male,No,2,0 +Bachelors,2013,Pune,3,32,Male,No,2,0 +Bachelors,2015,Pune,2,40,Female,No,4,1 +Bachelors,2013,New Delhi,3,38,Female,No,4,0 +Bachelors,2016,Bangalore,3,34,Male,Yes,2,0 +Bachelors,2016,Bangalore,1,39,Male,No,2,0 +Bachelors,2012,Bangalore,3,38,Male,No,2,0 +Masters,2017,New Delhi,2,31,Female,No,2,1 +Bachelors,2017,Bangalore,3,35,Female,No,5,0 +Bachelors,2013,Bangalore,3,31,Male,No,2,0 +Bachelors,2012,Pune,3,33,Male,No,1,0 +Bachelors,2015,Pune,2,37,Female,No,3,1 +Masters,2018,New Delhi,3,40,Female,No,2,1 +Bachelors,2014,Bangalore,3,38,Male,No,0,0 +Bachelors,2012,Bangalore,3,31,Male,Yes,5,0 +PHD,2014,Bangalore,3,39,Male,No,1,0 +Bachelors,2016,New Delhi,3,40,Male,No,0,0 +Bachelors,2017,Pune,3,36,Female,No,0,1 +Bachelors,2015,Bangalore,3,39,Female,No,3,1 +Bachelors,2012,Bangalore,3,39,Male,No,0,0 +Bachelors,2013,Bangalore,3,35,Female,No,0,0 +Masters,2013,New Delhi,3,35,Male,No,2,0 +Bachelors,2013,Bangalore,3,35,Male,No,5,0 +Masters,2017,Bangalore,3,34,Female,No,4,0 +Bachelors,2014,Bangalore,3,41,Male,No,4,0 +Bachelors,2017,Bangalore,3,35,Male,No,5,0 +Bachelors,2013,Bangalore,3,40,Male,No,1,0 +Masters,2017,Pune,3,31,Male,No,3,1 +Masters,2014,New Delhi,3,33,Male,No,3,0 +Bachelors,2017,Pune,2,33,Female,No,2,1 +Bachelors,2016,Bangalore,3,39,Female,No,5,0 +Bachelors,2016,Bangalore,3,41,Male,No,1,1 +Bachelors,2017,Bangalore,3,32,Male,No,5,0 +Bachelors,2014,Pune,2,39,Female,No,5,1 +Bachelors,2014,Bangalore,3,31,Male,No,1,0 +Bachelors,2012,Bangalore,3,40,Male,No,3,0 +Masters,2018,New Delhi,3,34,Male,No,2,1 +Bachelors,2018,New Delhi,3,37,Male,No,4,1 +Bachelors,2016,Bangalore,3,37,Female,No,0,0 +Bachelors,2014,Bangalore,3,36,Female,No,3,0 +Bachelors,2015,Bangalore,2,39,Female,No,0,1 +Bachelors,2014,Pune,3,37,Male,No,1,0 +Masters,2014,New Delhi,3,37,Male,No,2,0 +Masters,2017,New Delhi,3,32,Male,No,2,0 +Bachelors,2014,New Delhi,3,37,Male,No,3,0 +Bachelors,2017,Bangalore,3,36,Female,No,3,0 +Bachelors,2015,Pune,2,40,Female,No,2,1 +Bachelors,2014,Bangalore,3,40,Male,No,0,0 +Bachelors,2012,Pune,3,32,Male,No,3,0 +Bachelors,2012,Bangalore,3,37,Male,No,3,1 +Bachelors,2017,Pune,3,40,Female,No,1,1 +Bachelors,2014,Pune,3,40,Male,No,5,0 +Bachelors,2017,Bangalore,3,34,Female,Yes,0,0 +Bachelors,2012,Bangalore,3,37,Male,No,3,0 +Bachelors,2017,Bangalore,3,35,Male,No,3,0 +Bachelors,2017,Pune,3,37,Female,No,2,0 +Bachelors,2012,New Delhi,3,35,Female,No,2,0 +Bachelors,2014,Bangalore,3,31,Male,No,0,1 +Bachelors,2016,Bangalore,3,41,Male,No,4,0 +Masters,2017,New Delhi,3,37,Female,No,3,0 +Bachelors,2018,Pune,3,40,Male,No,0,1 +Bachelors,2018,Bangalore,1,36,Male,Yes,1,0 +PHD,2018,New Delhi,3,37,Female,No,2,1 +Bachelors,2014,Bangalore,3,40,Female,No,0,0 +Bachelors,2017,Bangalore,3,34,Male,No,3,0 +Bachelors,2018,Pune,3,37,Male,No,5,1 +Bachelors,2016,Pune,3,38,Male,No,0,0 +Bachelors,2017,Bangalore,2,37,Male,No,2,1 +Bachelors,2016,Pune,3,32,Male,No,1,1 +Bachelors,2016,Bangalore,3,31,Male,No,3,0 +Bachelors,2013,Bangalore,1,40,Male,No,2,0 +Bachelors,2017,Bangalore,3,40,Female,No,4,0 +Bachelors,2015,Bangalore,3,31,Male,No,1,0 +Masters,2017,Pune,2,36,Male,No,2,0 +Bachelors,2017,Bangalore,3,38,Male,Yes,2,0 +Bachelors,2014,Pune,3,37,Female,No,5,1 +Bachelors,2014,Pune,3,34,Female,No,2,1 +Bachelors,2013,Bangalore,3,41,Male,Yes,2,1 +Bachelors,2015,Pune,2,32,Female,No,3,1 +Bachelors,2015,Pune,3,34,Male,No,5,0 +PHD,2013,Bangalore,3,39,Male,No,2,1 +Masters,2013,New Delhi,2,32,Male,No,2,1 +Bachelors,2012,Bangalore,3,31,Female,No,3,0 +PHD,2016,New Delhi,3,40,Male,No,1,0 +Bachelors,2015,Bangalore,3,37,Female,No,0,0 +Masters,2017,New Delhi,3,40,Female,No,0,0 +Bachelors,2013,Bangalore,3,31,Male,No,1,0 +Bachelors,2017,Bangalore,3,32,Male,No,2,0 +Bachelors,2017,Bangalore,3,34,Female,Yes,1,0 +Masters,2013,Pune,2,41,Male,No,2,1 +Masters,2015,New Delhi,3,37,Male,No,2,0 +Bachelors,2015,Bangalore,3,40,Female,No,1,0 +Masters,2017,Pune,2,35,Male,No,2,0 +Bachelors,2012,Bangalore,3,39,Male,No,3,0 +Bachelors,2017,Pune,3,41,Male,No,4,0 +Bachelors,2015,Bangalore,3,36,Male,No,4,0 +Bachelors,2014,Bangalore,3,32,Male,No,5,0 +Bachelors,2013,Bangalore,3,41,Male,No,2,0 +Bachelors,2013,Bangalore,3,32,Male,No,0,0 +Bachelors,2017,Bangalore,3,36,Male,No,2,0 +Bachelors,2013,Bangalore,3,40,Male,No,4,0 +Bachelors,2018,Bangalore,3,32,Male,Yes,1,1 +Bachelors,2016,Bangalore,3,38,Male,No,1,0 +Bachelors,2018,Bangalore,3,41,Male,No,4,1 +Masters,2017,Pune,2,35,Male,No,3,1 +Bachelors,2016,Bangalore,3,36,Female,No,1,0 +Bachelors,2014,Bangalore,3,35,Female,No,4,0 +Bachelors,2016,Bangalore,3,31,Male,No,2,0 +PHD,2015,Pune,3,37,Male,No,2,0 +Bachelors,2013,Bangalore,3,41,Female,No,4,0 +Bachelors,2013,Bangalore,3,31,Male,No,0,0 +Bachelors,2017,New Delhi,2,36,Male,No,2,0 +Bachelors,2015,New Delhi,3,32,Male,No,1,0 +Bachelors,2017,Bangalore,3,34,Male,No,0,0 +Bachelors,2015,Bangalore,3,39,Female,No,0,0 +Bachelors,2014,Bangalore,3,33,Male,No,1,1 +Bachelors,2017,New Delhi,2,36,Male,No,3,0 +Bachelors,2016,Bangalore,1,34,Male,Yes,2,1 +Bachelors,2017,Pune,2,33,Male,No,1,0 +Bachelors,2012,Bangalore,3,38,Female,No,4,1 +Bachelors,2013,Bangalore,3,35,Male,No,3,1 +Bachelors,2017,Pune,3,31,Male,No,1,0 +Bachelors,2013,Pune,3,37,Male,No,2,0 +Bachelors,2012,Bangalore,3,32,Female,No,2,1 +Bachelors,2013,Pune,3,34,Male,Yes,5,0 +PHD,2013,Bangalore,2,41,Male,No,2,1 +Masters,2015,New Delhi,3,32,Male,No,0,1 +Bachelors,2013,Bangalore,3,39,Male,No,2,0 +Bachelors,2012,Bangalore,3,31,Male,Yes,0,1 +Bachelors,2017,New Delhi,2,41,Male,No,1,0 +Bachelors,2016,Bangalore,3,36,Male,No,2,0 +Bachelors,2017,Bangalore,2,38,Female,No,5,1 +Bachelors,2012,Bangalore,3,32,Male,No,5,0 +Bachelors,2018,Pune,3,35,Female,No,3,1 +Bachelors,2017,Bangalore,3,39,Male,No,2,0 +Masters,2017,New Delhi,2,36,Male,Yes,2,0 +Bachelors,2013,Pune,3,33,Male,No,4,0 +Bachelors,2013,Pune,3,32,Male,Yes,5,0 +Bachelors,2017,Bangalore,3,35,Male,No,1,1 +Bachelors,2015,Bangalore,3,36,Male,No,1,0 +Masters,2014,Pune,3,39,Male,No,4,0 +Bachelors,2016,Bangalore,3,40,Male,No,0,1 +Bachelors,2012,Bangalore,3,37,Male,No,3,0 +Masters,2015,Pune,1,38,Female,No,0,0 +Bachelors,2017,New Delhi,3,40,Male,No,1,0 +Bachelors,2013,Bangalore,3,34,Female,No,2,0 +Bachelors,2013,Bangalore,3,31,Male,Yes,4,0 +Bachelors,2014,New Delhi,3,40,Female,No,3,1 +Bachelors,2013,Bangalore,3,37,Male,No,2,0 +Bachelors,2012,New Delhi,3,33,Male,No,3,0 +Bachelors,2015,Bangalore,3,36,Male,Yes,4,0 +Bachelors,2014,Bangalore,3,35,Female,No,4,0 +Bachelors,2014,Bangalore,3,34,Male,No,5,0 +Bachelors,2013,Bangalore,3,35,Male,No,0,1 +Masters,2014,New Delhi,3,39,Male,No,2,0 +Bachelors,2015,Pune,3,35,Female,No,1,1 +Masters,2014,New Delhi,3,34,Male,No,5,0 +Bachelors,2017,Pune,2,32,Female,No,2,1 +Bachelors,2015,New Delhi,3,32,Female,No,2,0 +Bachelors,2014,Bangalore,3,33,Male,No,5,1 +Masters,2017,New Delhi,2,34,Male,No,2,1 +Masters,2016,Bangalore,3,35,Female,No,1,1 +Masters,2017,New Delhi,3,35,Male,Yes,2,0 +Bachelors,2014,Pune,2,38,Female,No,3,1 +Bachelors,2016,Bangalore,3,37,Male,No,0,0 +Bachelors,2013,Bangalore,3,38,Female,No,4,0 +Bachelors,2015,Bangalore,3,41,Male,No,0,0 +Masters,2017,Bangalore,3,40,Male,No,4,1 +Bachelors,2017,Bangalore,3,39,Female,No,3,0 +Bachelors,2017,Pune,2,32,Male,No,2,0 +Bachelors,2018,New Delhi,3,40,Male,Yes,4,1 +Bachelors,2016,Bangalore,3,40,Male,No,0,0 +Bachelors,2016,Bangalore,3,41,Female,No,1,1 +Bachelors,2015,Bangalore,3,38,Male,Yes,4,0 +Masters,2017,Pune,1,38,Male,No,0,1 +Bachelors,2018,Bangalore,3,41,Female,No,2,1 +Bachelors,2015,New Delhi,2,33,Female,No,4,1 +Bachelors,2012,Bangalore,3,41,Male,Yes,0,0 +Bachelors,2017,New Delhi,2,35,Female,No,5,0 +Bachelors,2013,Bangalore,3,36,Male,No,5,0 +Bachelors,2013,Pune,3,37,Male,No,1,0 +Bachelors,2013,New Delhi,1,37,Female,No,1,0 +Bachelors,2014,Bangalore,3,39,Male,No,5,0 +Bachelors,2017,Bangalore,3,38,Female,No,2,0 +Bachelors,2013,Pune,2,34,Female,No,1,1 +Bachelors,2017,Pune,2,33,Female,No,4,1 +Bachelors,2013,Bangalore,3,32,Female,No,1,0 +Masters,2014,Bangalore,3,38,Female,No,4,1 +Bachelors,2017,Bangalore,3,32,Male,No,5,0 +Masters,2016,New Delhi,3,41,Male,No,5,1 +Masters,2014,Pune,3,36,Female,No,2,0 +Bachelors,2017,New Delhi,3,34,Female,No,2,1 +Bachelors,2017,Bangalore,3,34,Male,Yes,0,0 +Bachelors,2016,Bangalore,3,35,Male,No,4,0 +Masters,2015,New Delhi,3,38,Male,No,1,0 +Bachelors,2016,Bangalore,3,32,Male,Yes,5,0 +Bachelors,2015,Pune,3,37,Female,No,2,1 +Bachelors,2017,Bangalore,2,32,Female,No,2,1 +Masters,2017,New Delhi,2,36,Male,No,3,0 +Bachelors,2012,Bangalore,3,41,Male,No,3,0 +Bachelors,2017,Pune,3,37,Female,No,5,0 +Bachelors,2018,Bangalore,3,34,Female,No,3,1 +Bachelors,2016,Pune,3,31,Male,No,0,1 +Bachelors,2017,Bangalore,3,41,Male,No,1,0 +Bachelors,2015,New Delhi,3,35,Female,No,3,0 +Bachelors,2015,Bangalore,3,37,Female,No,5,0 +Bachelors,2016,Bangalore,3,34,Male,No,4,0 +Masters,2017,Bangalore,2,40,Female,Yes,2,0 +Bachelors,2015,Bangalore,3,39,Male,No,5,1 +Bachelors,2013,Pune,3,37,Male,No,2,0 +Bachelors,2015,Pune,2,36,Female,Yes,1,1 +Bachelors,2014,Bangalore,3,35,Female,No,2,0 +Masters,2013,Bangalore,3,37,Female,No,3,1 +Bachelors,2013,New Delhi,3,41,Female,No,1,0 +Masters,2017,New Delhi,2,40,Male,No,2,0 +Bachelors,2016,Bangalore,3,37,Male,No,2,0 +Masters,2013,New Delhi,3,40,Female,No,2,1 +Bachelors,2015,Bangalore,3,39,Male,No,5,0 +Masters,2015,Pune,2,33,Female,No,4,0 +Bachelors,2012,Bangalore,3,36,Male,No,1,1 +Bachelors,2012,Bangalore,3,36,Male,No,5,0 +Bachelors,2015,Bangalore,3,38,Male,No,3,0 +Bachelors,2017,New Delhi,2,37,Female,No,5,0 +Masters,2017,New Delhi,3,34,Female,No,2,0 +Bachelors,2013,Bangalore,3,31,Male,No,2,1 +Bachelors,2013,Bangalore,3,38,Male,No,5,0 +Bachelors,2017,Bangalore,3,36,Male,No,3,0 +Bachelors,2012,Bangalore,3,40,Male,No,1,0 +Bachelors,2017,Bangalore,3,41,Male,No,5,1 +Bachelors,2015,Bangalore,3,31,Female,No,4,0 +Bachelors,2017,New Delhi,3,41,Male,No,2,0 +Bachelors,2015,New Delhi,3,31,Female,No,3,0 +Bachelors,2017,Pune,3,31,Female,No,0,1 +Bachelors,2017,New Delhi,2,37,Male,No,0,0 +Bachelors,2012,Pune,3,39,Male,No,0,0 +Bachelors,2014,Bangalore,3,38,Male,No,3,0 +Bachelors,2013,Pune,3,40,Female,No,2,1 +Bachelors,2013,Pune,3,36,Male,No,1,0 +Bachelors,2016,Bangalore,3,41,Male,No,3,0 +Bachelors,2018,Bangalore,3,32,Female,No,2,1 +Masters,2018,Bangalore,3,40,Female,No,3,1 +Bachelors,2012,Bangalore,3,39,Female,No,2,0 +Bachelors,2014,New Delhi,3,33,Male,No,3,0 +Bachelors,2012,Bangalore,3,32,Male,No,4,0 +Bachelors,2018,Bangalore,3,41,Male,No,5,1 +Bachelors,2016,Bangalore,3,36,Male,No,2,0 +Bachelors,2016,Bangalore,3,31,Male,No,0,0 +Bachelors,2014,Bangalore,3,37,Male,No,4,0 +Bachelors,2014,Bangalore,3,33,Male,No,5,1 +Masters,2018,Pune,3,31,Male,No,2,1 +Bachelors,2017,New Delhi,3,35,Female,No,5,0 +Bachelors,2015,Pune,1,32,Female,No,5,1 +Masters,2017,New Delhi,3,41,Female,No,2,0 +Masters,2017,New Delhi,2,36,Female,No,1,0 +Masters,2017,Pune,3,35,Male,No,1,0 +Masters,2017,New Delhi,3,35,Male,No,1,1 +Bachelors,2015,New Delhi,3,33,Male,No,1,0 +Bachelors,2014,Bangalore,3,38,Female,No,4,0 +Bachelors,2015,New Delhi,2,33,Female,No,3,1 +Masters,2018,New Delhi,3,31,Female,Yes,2,1 +PHD,2015,Bangalore,3,31,Male,No,3,0 +Bachelors,2013,Bangalore,3,37,Male,No,5,0 +Bachelors,2014,Bangalore,3,32,Male,No,1,0 +Bachelors,2017,Bangalore,3,33,Male,No,3,0 +Bachelors,2014,Bangalore,3,37,Male,No,5,0 +Bachelors,2012,Bangalore,3,32,Male,No,3,0 +Bachelors,2015,Pune,3,40,Female,Yes,2,1 +Bachelors,2014,Pune,1,40,Female,No,1,1 +Masters,2013,New Delhi,2,32,Male,No,2,1 +Masters,2017,Bangalore,2,39,Female,No,2,1 +PHD,2016,New Delhi,3,41,Male,No,1,0 +PHD,2014,New Delhi,3,32,Female,No,0,0 +Bachelors,2017,Bangalore,3,38,Male,No,0,1 +Masters,2017,New Delhi,2,31,Female,Yes,2,0 +Bachelors,2018,Bangalore,3,38,Male,Yes,3,1 +Bachelors,2016,Bangalore,3,32,Male,No,4,0 +Bachelors,2017,Pune,2,35,Female,No,5,1 +Bachelors,2013,Bangalore,3,34,Male,No,5,0 +Bachelors,2018,Bangalore,3,38,Male,Yes,1,1 +Bachelors,2014,Pune,1,36,Female,No,1,1 +Bachelors,2015,Bangalore,3,34,Female,Yes,2,0 +Masters,2015,New Delhi,3,39,Female,No,2,0 +Masters,2017,New Delhi,1,40,Female,No,0,0 +Bachelors,2016,Bangalore,3,38,Male,Yes,1,0 +Bachelors,2015,Pune,3,35,Male,No,3,0 +Bachelors,2014,Pune,2,31,Male,No,3,1 +Bachelors,2017,Pune,3,41,Male,No,2,0 +Bachelors,2017,Bangalore,3,35,Female,No,3,0 +Bachelors,2018,Bangalore,3,33,Male,No,5,1 +Bachelors,2017,New Delhi,2,33,Male,No,5,0 +Bachelors,2016,New Delhi,3,31,Female,Yes,4,0 +Masters,2013,New Delhi,3,35,Male,No,4,0 +Bachelors,2016,Bangalore,3,37,Female,No,1,0 +Bachelors,2015,Bangalore,3,31,Male,No,5,0 +Bachelors,2012,Bangalore,3,35,Male,No,1,1 +Bachelors,2014,Bangalore,3,32,Male,No,3,0 +Bachelors,2015,Bangalore,3,32,Female,No,0,0 +Bachelors,2017,Bangalore,3,40,Female,No,5,0 +Bachelors,2012,Bangalore,3,34,Male,No,5,0 +Bachelors,2014,Pune,3,37,Male,No,4,0 +PHD,2015,Bangalore,3,40,Male,No,3,0 +Masters,2017,New Delhi,2,34,Female,No,2,1 +Bachelors,2015,Pune,2,32,Female,No,3,1 +Bachelors,2013,Bangalore,3,33,Male,No,1,0 +Bachelors,2015,Bangalore,3,38,Male,No,3,1 +Masters,2017,New Delhi,2,41,Male,No,3,1 +Masters,2017,New Delhi,1,36,Female,No,0,0 +Bachelors,2016,Bangalore,3,33,Male,No,1,0 +Bachelors,2014,Pune,3,31,Male,No,5,0 +Bachelors,2013,Pune,2,34,Female,No,3,1 +Bachelors,2017,Bangalore,3,31,Male,No,1,0 +Bachelors,2016,New Delhi,2,36,Female,No,4,1 +Bachelors,2013,Bangalore,3,38,Male,No,5,0 +Bachelors,2015,Pune,2,39,Female,Yes,1,1 +Bachelors,2014,Pune,3,31,Male,No,3,0 +Bachelors,2015,New Delhi,3,40,Male,No,3,1 +Bachelors,2013,Bangalore,3,39,Male,No,0,0 +Bachelors,2015,Bangalore,3,32,Female,No,4,0 +Bachelors,2014,Bangalore,3,34,Male,No,1,0 +Masters,2015,New Delhi,3,38,Male,No,1,0 +Bachelors,2014,Bangalore,1,39,Male,No,2,0 +Bachelors,2014,Bangalore,3,39,Male,No,5,0 +Bachelors,2016,Bangalore,3,33,Male,No,1,0 +Bachelors,2018,Pune,2,34,Female,No,4,1 +Bachelors,2017,Pune,3,38,Male,Yes,1,0 +Masters,2017,New Delhi,2,33,Male,No,2,0 +Bachelors,2014,Bangalore,3,41,Male,No,5,0 +Masters,2017,Pune,1,39,Male,No,0,0 +Masters,2013,Pune,3,39,Male,No,2,0 +Bachelors,2014,Bangalore,3,41,Male,No,5,0 +Bachelors,2012,Bangalore,3,40,Male,No,4,0 +Bachelors,2014,Bangalore,3,36,Male,No,0,0 +Bachelors,2015,Bangalore,3,34,Male,No,0,0 +Bachelors,2013,Bangalore,3,32,Male,No,5,1 +Bachelors,2015,Bangalore,3,31,Male,No,4,0 +Bachelors,2012,Bangalore,3,36,Male,Yes,0,0 +Masters,2017,Pune,2,35,Male,No,1,1 +Bachelors,2017,Bangalore,3,32,Male,No,2,0 +Bachelors,2017,Pune,3,33,Male,Yes,5,0 +Bachelors,2016,Bangalore,3,34,Male,No,2,0 +Bachelors,2017,Bangalore,3,39,Male,No,3,0 +Bachelors,2018,Bangalore,3,38,Male,No,0,1 +Bachelors,2012,Pune,2,35,Female,No,1,1 +Bachelors,2015,Pune,2,40,Female,Yes,5,1 +Bachelors,2017,Pune,3,41,Male,No,3,0 +Bachelors,2016,Bangalore,1,33,Female,Yes,3,0 +Masters,2017,New Delhi,1,40,Male,No,0,0 +Bachelors,2018,Bangalore,3,33,Female,No,3,1 +Bachelors,2015,Bangalore,3,38,Male,No,1,1 +Masters,2017,Bangalore,2,32,Male,No,2,0 +Bachelors,2014,Pune,3,32,Male,Yes,2,0 +Bachelors,2015,New Delhi,3,32,Female,No,2,0 +Bachelors,2016,Pune,2,37,Female,No,2,1 +Bachelors,2015,Bangalore,3,40,Male,No,5,0 +Bachelors,2016,Bangalore,3,38,Male,No,1,0 +PHD,2018,New Delhi,3,33,Female,No,4,1 +Masters,2017,New Delhi,2,40,Male,No,4,0 +Masters,2017,New Delhi,2,35,Male,No,2,0 +Bachelors,2016,Bangalore,3,33,Male,No,3,0 +Bachelors,2017,Bangalore,3,37,Male,No,4,0 +Bachelors,2013,Bangalore,3,38,Male,No,0,0 +Bachelors,2018,Bangalore,3,32,Male,No,2,1 +Bachelors,2017,Bangalore,3,40,Female,No,2,0 +Bachelors,2015,New Delhi,3,33,Female,No,2,0 +Bachelors,2016,Bangalore,3,38,Male,No,2,1 +Bachelors,2013,Bangalore,3,34,Male,No,5,0 +Bachelors,2017,New Delhi,3,38,Female,No,4,0 +Bachelors,2018,Pune,2,31,Female,No,3,1 +Bachelors,2014,Pune,3,32,Female,No,4,0 +Bachelors,2013,Bangalore,3,35,Male,Yes,1,0 +Bachelors,2014,Bangalore,3,35,Male,No,0,1 +Bachelors,2012,Bangalore,3,33,Female,No,4,0 +Bachelors,2012,New Delhi,3,41,Female,No,0,0 +Bachelors,2015,Pune,1,31,Female,No,3,1 +Bachelors,2016,Bangalore,3,34,Male,No,3,0 +Masters,2017,New Delhi,2,40,Female,No,2,0 +Masters,2016,Bangalore,3,32,Male,No,1,1 +Bachelors,2012,Bangalore,3,36,Male,No,5,0 +Bachelors,2014,Pune,2,40,Female,No,3,1 +Bachelors,2012,Pune,3,31,Male,No,3,0 +Bachelors,2014,Bangalore,1,34,Female,No,5,0 +Masters,2013,New Delhi,3,41,Female,Yes,2,1 +Masters,2017,New Delhi,2,32,Male,No,2,0 +Bachelors,2016,Bangalore,3,41,Male,No,2,0 +Masters,2014,New Delhi,3,33,Male,No,3,0 +Bachelors,2013,Bangalore,3,33,Female,No,0,1 +Bachelors,2013,Pune,3,39,Female,No,2,0 +Masters,2018,Pune,3,40,Male,No,2,1 +Bachelors,2017,New Delhi,3,34,Male,No,3,0 +Bachelors,2016,Pune,3,41,Male,Yes,5,0 +Bachelors,2015,Pune,3,37,Male,No,5,1 +Masters,2017,Bangalore,3,32,Female,No,4,1 +Bachelors,2017,Bangalore,3,41,Male,No,3,0 +Bachelors,2018,Bangalore,3,34,Female,Yes,2,1 +Masters,2017,Bangalore,3,38,Male,No,5,1 +Bachelors,2017,Bangalore,3,40,Female,No,3,0 +Masters,2017,Pune,3,35,Male,No,2,0 +Bachelors,2015,Pune,3,31,Male,No,1,0 +Bachelors,2016,Pune,3,39,Male,No,4,0 +Bachelors,2018,Bangalore,3,39,Male,No,1,1 +Bachelors,2018,Bangalore,3,32,Male,No,3,1 +Bachelors,2015,Bangalore,3,38,Male,No,5,0 +Bachelors,2015,Bangalore,3,35,Male,No,3,0 +Bachelors,2013,Bangalore,1,38,Male,No,4,0 +Bachelors,2012,New Delhi,3,32,Male,No,1,1 +Bachelors,2014,Pune,2,37,Female,No,5,1 +Bachelors,2015,Pune,3,35,Male,No,0,0 +Bachelors,2017,Pune,3,41,Female,No,4,1 +Masters,2015,Bangalore,3,36,Male,No,0,0 +Bachelors,2017,Bangalore,3,35,Male,No,2,0 +Masters,2017,New Delhi,2,36,Male,No,2,1 +Masters,2017,Bangalore,1,34,Male,No,1,0 +Bachelors,2015,Bangalore,3,36,Male,No,3,0 +Bachelors,2017,Pune,2,33,Male,No,3,0 +Masters,2018,New Delhi,3,38,Male,No,2,1 +PHD,2013,New Delhi,3,35,Female,Yes,3,1 +Bachelors,2015,New Delhi,2,37,Female,No,3,1 +Bachelors,2017,Bangalore,3,31,Male,No,0,0 +Bachelors,2017,Pune,2,40,Female,No,2,1 +Bachelors,2015,Pune,3,32,Female,No,3,1 +Bachelors,2015,Bangalore,3,35,Male,Yes,2,0 +Bachelors,2012,Bangalore,3,38,Male,Yes,0,0 +Bachelors,2015,Pune,2,36,Female,No,0,1 +Masters,2015,Pune,3,36,Male,No,3,0 +Masters,2014,New Delhi,3,32,Female,No,5,0 +Bachelors,2018,Pune,2,37,Female,No,0,1 +Bachelors,2018,Pune,3,35,Female,No,0,1 +Bachelors,2015,Pune,1,36,Female,No,4,1 +Bachelors,2015,New Delhi,2,34,Female,No,5,1 +Masters,2017,New Delhi,2,35,Female,No,0,0 +Masters,2017,New Delhi,2,38,Female,No,5,0 +Bachelors,2015,Pune,2,39,Female,No,5,1 +Bachelors,2012,Pune,2,32,Female,No,5,1 +Bachelors,2015,Bangalore,3,39,Male,No,2,0 +Bachelors,2015,Bangalore,3,39,Male,No,2,1 +Masters,2017,Pune,2,37,Male,No,2,0 +Bachelors,2015,Bangalore,3,32,Female,No,5,0 +Bachelors,2017,New Delhi,2,38,Male,No,0,0 +Bachelors,2012,Pune,2,36,Female,No,5,1 +Masters,2016,Bangalore,1,37,Male,No,2,1 +Bachelors,2017,Pune,3,32,Male,No,4,0 +Masters,2017,New Delhi,3,37,Male,No,2,0 +Bachelors,2016,New Delhi,3,33,Male,No,2,0 +Bachelors,2016,Bangalore,3,39,Male,No,4,0 +Bachelors,2012,Bangalore,3,35,Male,No,1,1 +Masters,2015,Pune,3,39,Male,No,5,0 +Bachelors,2015,Bangalore,3,34,Male,No,0,0 +Masters,2017,New Delhi,2,33,Male,No,4,0 +Bachelors,2012,Bangalore,3,33,Male,No,1,0 +Bachelors,2015,New Delhi,3,31,Male,No,0,0 +PHD,2016,Pune,3,31,Female,No,4,0 +Bachelors,2015,Bangalore,3,37,Female,No,4,0 +Bachelors,2012,Bangalore,3,33,Male,No,0,0 +Bachelors,2017,Pune,3,31,Male,No,0,0 +Bachelors,2017,Bangalore,3,41,Female,No,2,0 +Masters,2017,Pune,2,39,Male,No,2,0 +Masters,2013,New Delhi,3,32,Male,No,2,0 +Bachelors,2016,Pune,3,37,Male,No,3,0 +Bachelors,2014,Bangalore,3,37,Male,No,1,0 +Bachelors,2017,Pune,2,34,Female,No,3,1 +Bachelors,2017,New Delhi,2,31,Male,No,2,0 +Bachelors,2014,Pune,2,34,Female,Yes,1,1 +Bachelors,2012,Bangalore,3,38,Female,No,5,0 +Bachelors,2013,Bangalore,3,37,Female,No,1,0 +Bachelors,2015,Pune,1,34,Female,No,3,1 +Bachelors,2015,Bangalore,3,33,Male,No,2,0 +Bachelors,2016,Bangalore,3,37,Male,No,4,0 +Bachelors,2016,Bangalore,3,41,Male,No,4,0 +Bachelors,2012,Bangalore,1,38,Female,No,1,0 +Bachelors,2016,Pune,3,40,Male,No,5,0 +Bachelors,2017,New Delhi,3,33,Female,No,1,1 +Bachelors,2016,New Delhi,3,33,Male,No,1,0 +Masters,2013,New Delhi,3,37,Male,Yes,2,0 +Bachelors,2017,New Delhi,2,36,Female,No,2,0 +Bachelors,2012,Bangalore,3,36,Female,No,5,0 +Bachelors,2015,Bangalore,3,41,Male,No,1,0 +Masters,2014,New Delhi,3,40,Male,No,5,0 +Bachelors,2016,Bangalore,3,36,Female,No,0,0 +Masters,2017,Bangalore,2,41,Male,Yes,2,1 +Bachelors,2015,Pune,3,33,Male,No,5,0 +Masters,2017,New Delhi,2,37,Female,No,2,0 +Bachelors,2017,New Delhi,2,33,Male,No,0,0 +Bachelors,2014,Bangalore,3,40,Female,No,4,0 +Masters,2018,New Delhi,3,36,Male,No,2,1 +Bachelors,2018,Bangalore,3,40,Male,Yes,3,1 +Masters,2018,Bangalore,3,40,Male,No,2,1 +Bachelors,2014,Bangalore,3,34,Male,No,3,0 +Bachelors,2012,Pune,3,39,Male,No,5,0 +Bachelors,2017,Pune,2,33,Male,No,1,1 +Bachelors,2016,Bangalore,3,37,Male,No,2,0 +Bachelors,2012,New Delhi,3,40,Male,No,3,0 +Bachelors,2018,Bangalore,3,38,Male,No,1,1 +Bachelors,2016,Bangalore,3,40,Male,Yes,1,0 +Bachelors,2014,New Delhi,3,38,Female,No,0,0 +Bachelors,2016,Bangalore,3,34,Male,Yes,1,0 +Masters,2016,New Delhi,3,37,Female,No,3,1 +Bachelors,2015,Bangalore,3,40,Male,No,5,0 +Bachelors,2015,New Delhi,3,40,Female,No,1,0 +Masters,2016,Bangalore,3,37,Male,No,2,1 +Bachelors,2016,Pune,2,37,Female,No,3,1 +Bachelors,2013,Pune,3,32,Male,No,1,0 +Masters,2017,New Delhi,1,35,Male,No,5,0 +Bachelors,2016,Bangalore,1,38,Male,No,3,0 +Bachelors,2017,Pune,3,34,Female,No,1,0 +Bachelors,2014,Bangalore,3,32,Male,No,2,1 +Bachelors,2013,Bangalore,3,37,Male,No,5,0 +Bachelors,2017,New Delhi,2,37,Male,No,4,0 +Bachelors,2014,Bangalore,3,35,Male,No,2,0 +Bachelors,2016,Bangalore,3,40,Male,No,0,0 +Bachelors,2012,Bangalore,3,40,Male,Yes,2,0 +Bachelors,2015,Bangalore,3,39,Female,No,3,1 +Masters,2013,New Delhi,3,41,Female,No,2,0 +Bachelors,2015,Bangalore,3,34,Female,No,4,0 +Bachelors,2012,New Delhi,3,34,Female,No,4,0 +Bachelors,2013,Pune,2,36,Male,No,2,1 +Masters,2016,New Delhi,3,39,Female,No,1,0 +Bachelors,2014,New Delhi,3,41,Male,No,5,0 +Bachelors,2015,Bangalore,3,40,Male,No,0,0 +Bachelors,2017,Bangalore,3,34,Female,No,5,0 +Bachelors,2013,Bangalore,3,31,Male,No,2,0 +Bachelors,2012,Pune,3,40,Male,No,3,0 +Bachelors,2013,Pune,3,32,Male,No,5,0 +Bachelors,2018,Pune,3,38,Male,No,3,1 +Bachelors,2016,Bangalore,3,40,Male,No,3,0 +PHD,2013,Bangalore,3,41,Male,No,4,0 +Bachelors,2014,Bangalore,3,36,Female,No,0,0 +Bachelors,2015,Pune,2,33,Female,Yes,3,1 +Bachelors,2016,New Delhi,3,37,Male,No,3,0 +Bachelors,2015,Pune,3,38,Male,No,4,0 +Bachelors,2017,Bangalore,3,32,Male,No,4,0 +Bachelors,2017,Pune,3,33,Male,No,1,0 +Bachelors,2015,Bangalore,3,38,Male,No,5,0 +Bachelors,2015,Pune,3,40,Female,No,5,1 +Bachelors,2014,Bangalore,3,35,Male,Yes,0,0 +Masters,2016,New Delhi,3,37,Female,No,5,0 +Bachelors,2016,Bangalore,3,37,Male,Yes,2,0 +Bachelors,2015,Bangalore,3,36,Male,No,2,0 +Bachelors,2017,Bangalore,3,33,Female,No,4,1 +Bachelors,2014,Pune,2,36,Female,No,3,1 +Bachelors,2016,Pune,3,32,Male,No,3,0 +Bachelors,2017,Bangalore,3,35,Female,No,1,1 +Bachelors,2014,Pune,2,34,Female,No,2,1 +Masters,2017,Pune,2,40,Male,No,5,0 +Bachelors,2016,Bangalore,3,37,Female,No,4,0 +Bachelors,2015,Bangalore,1,36,Male,No,1,0 +Bachelors,2012,Pune,3,41,Female,No,1,0 +Bachelors,2016,Pune,3,36,Male,No,0,0 +Bachelors,2017,Bangalore,3,31,Female,No,2,0 +Bachelors,2017,Pune,3,31,Male,No,3,0 +Bachelors,2014,Pune,3,33,Male,No,2,0 +Bachelors,2017,Bangalore,3,35,Male,Yes,0,0 +PHD,2016,New Delhi,3,34,Male,No,1,0 +Bachelors,2014,Bangalore,3,39,Female,No,4,0 +Masters,2015,Bangalore,3,31,Male,No,1,1 +Bachelors,2015,Pune,3,32,Female,No,0,1 +Bachelors,2017,Bangalore,3,33,Male,No,0,1 +Bachelors,2014,Bangalore,3,34,Male,Yes,1,0 +Masters,2014,Pune,3,39,Male,No,2,0 +Bachelors,2017,New Delhi,2,41,Female,No,2,1 +Bachelors,2017,New Delhi,2,34,Male,No,2,0 +Bachelors,2013,Bangalore,3,36,Female,No,5,0 +Bachelors,2015,Pune,2,39,Female,No,5,1 +Bachelors,2012,Pune,3,37,Male,No,5,0 +Bachelors,2016,Bangalore,3,36,Male,No,4,0 +Bachelors,2014,New Delhi,3,38,Female,No,1,0 +Bachelors,2017,Bangalore,3,38,Female,No,3,0 +Masters,2016,New Delhi,3,37,Female,No,2,1 +Bachelors,2012,Bangalore,3,34,Male,No,2,0 +Bachelors,2015,Bangalore,3,31,Male,No,2,0 +Bachelors,2015,Pune,2,32,Female,No,2,1 +Masters,2018,New Delhi,3,35,Male,No,2,1 +Bachelors,2017,Bangalore,3,31,Male,Yes,2,0 +Bachelors,2015,Bangalore,1,32,Male,Yes,0,1 +Bachelors,2015,Bangalore,3,31,Female,No,5,0 +Bachelors,2018,Bangalore,3,37,Male,No,5,1 +PHD,2018,New Delhi,3,40,Male,No,3,1 +Bachelors,2015,Bangalore,1,41,Male,No,1,0 +Bachelors,2017,Pune,3,34,Male,No,5,0 +Bachelors,2014,Bangalore,3,36,Male,Yes,3,0 +Bachelors,2013,Pune,3,35,Male,No,1,0 +Masters,2017,New Delhi,3,38,Female,No,3,0 +Bachelors,2017,Bangalore,3,33,Male,No,1,0 +Bachelors,2014,Bangalore,3,38,Female,No,2,0 +Bachelors,2018,Bangalore,3,38,Male,No,1,1 +Bachelors,2017,Pune,2,40,Male,No,4,0 +Bachelors,2013,New Delhi,3,39,Male,No,5,0 +Bachelors,2014,New Delhi,3,33,Female,No,4,0 +Bachelors,2015,Pune,3,32,Female,No,3,1 +Bachelors,2013,Bangalore,3,39,Male,No,2,0 +Bachelors,2015,Bangalore,3,38,Female,No,4,0 +Bachelors,2013,Bangalore,3,38,Male,No,2,0 +Bachelors,2017,Bangalore,3,35,Male,No,0,0 +Bachelors,2017,Pune,3,31,Female,No,0,1 +Bachelors,2017,Bangalore,3,41,Male,No,5,0 +Bachelors,2013,New Delhi,3,38,Female,No,4,1 +Bachelors,2016,Bangalore,3,40,Male,Yes,1,0 +Bachelors,2018,Bangalore,3,36,Female,No,2,1 +PHD,2013,New Delhi,3,36,Male,No,3,1 +Bachelors,2014,Pune,3,41,Male,No,4,0 +Bachelors,2014,Bangalore,3,35,Male,Yes,1,0 +Bachelors,2017,Bangalore,3,38,Male,No,5,0 +Bachelors,2017,New Delhi,2,41,Female,No,0,0 +Bachelors,2012,Bangalore,1,34,Male,No,0,0 +Bachelors,2016,Bangalore,3,39,Female,No,3,1 +Bachelors,2014,Bangalore,3,37,Male,No,5,0 +Bachelors,2015,Pune,2,39,Female,Yes,0,1 +Bachelors,2013,Bangalore,3,31,Male,No,2,1 +Masters,2012,New Delhi,3,34,Female,No,3,0 +Bachelors,2015,Bangalore,3,39,Male,No,1,0 +Bachelors,2014,Pune,2,38,Female,No,3,1 +Bachelors,2012,Bangalore,3,34,Male,No,1,0 +Bachelors,2016,Bangalore,3,31,Female,No,2,0 +Bachelors,2016,Bangalore,3,39,Female,No,0,0 +Bachelors,2013,Bangalore,3,31,Female,No,1,0 +Bachelors,2012,Bangalore,3,36,Male,No,1,0 +Bachelors,2017,New Delhi,3,37,Male,No,0,0 +Bachelors,2015,Pune,1,38,Female,No,1,1 +PHD,2017,Pune,3,41,Male,No,2,0 +Bachelors,2018,Bangalore,3,32,Male,No,4,1 +Bachelors,2018,Pune,3,35,Male,No,0,1 +Bachelors,2017,Bangalore,3,35,Male,No,1,0 +Bachelors,2013,Bangalore,3,32,Male,No,1,0 +Bachelors,2015,Bangalore,3,31,Male,No,1,1 +Bachelors,2015,Bangalore,3,41,Male,No,4,0 +Bachelors,2012,Bangalore,3,33,Male,Yes,0,0 +Bachelors,2012,New Delhi,2,38,Female,No,1,1 +Masters,2012,Bangalore,3,39,Female,No,3,1 +Bachelors,2015,Bangalore,1,36,Female,No,2,0 +Masters,2017,Bangalore,2,31,Male,No,5,0 +Masters,2017,New Delhi,2,39,Female,No,2,1 +Masters,2017,New Delhi,3,41,Male,No,3,1 +PHD,2018,New Delhi,3,33,Female,No,0,1 +Bachelors,2015,Bangalore,3,38,Male,No,1,0 +Bachelors,2017,Pune,2,31,Male,No,0,0 +Bachelors,2014,Bangalore,3,34,Male,No,4,0 +Bachelors,2017,Bangalore,3,40,Male,No,2,0 +Bachelors,2012,Bangalore,3,36,Male,No,1,0 +Bachelors,2015,Bangalore,3,36,Female,No,2,0 +Bachelors,2017,New Delhi,2,41,Female,No,4,0 +Bachelors,2017,Bangalore,3,37,Male,No,3,0 +Bachelors,2017,New Delhi,3,33,Male,No,5,0 +Bachelors,2017,New Delhi,3,41,Female,No,4,0 +Bachelors,2017,Bangalore,3,37,Female,No,2,0 +Bachelors,2017,Pune,3,38,Male,Yes,5,0 +Bachelors,2015,Bangalore,3,34,Male,No,2,1 +Bachelors,2017,Pune,3,37,Female,No,0,0 +Bachelors,2014,Bangalore,3,34,Male,No,0,1 +Bachelors,2012,Pune,3,32,Male,No,1,0 +Masters,2012,New Delhi,3,35,Female,No,4,1 +Bachelors,2013,Pune,3,36,Male,No,3,0 +Bachelors,2015,Bangalore,3,34,Female,No,2,0 +Bachelors,2014,Bangalore,3,37,Female,No,3,0 +Bachelors,2016,Bangalore,3,40,Female,Yes,4,0 +Bachelors,2014,Pune,3,33,Male,No,4,0 +Bachelors,2016,Bangalore,3,39,Female,No,4,0 +Bachelors,2012,Bangalore,3,40,Male,No,4,0 +Bachelors,2013,Bangalore,1,34,Male,No,4,1 +Bachelors,2016,Pune,3,40,Male,No,5,0 +PHD,2013,Bangalore,3,32,Male,No,5,0 +Bachelors,2012,Bangalore,3,33,Male,No,1,0 +Bachelors,2017,New Delhi,1,31,Female,No,4,1 +Masters,2016,New Delhi,3,41,Female,No,4,0 +Bachelors,2016,Bangalore,3,34,Male,No,4,0 +Bachelors,2016,Bangalore,3,39,Male,No,7,0 +Bachelors,2014,Bangalore,3,35,Male,No,5,0 +Bachelors,2016,Pune,3,38,Female,No,7,0 +Bachelors,2016,Bangalore,3,33,Male,No,6,0 +Bachelors,2014,Pune,3,33,Male,No,6,0 +Bachelors,2012,Bangalore,3,35,Male,No,5,0 +PHD,2013,New Delhi,3,40,Male,No,5,0 +Bachelors,2012,Bangalore,3,40,Female,No,5,0 +Bachelors,2017,Bangalore,3,39,Male,No,5,0 +Bachelors,2017,Bangalore,3,33,Female,No,6,0 +Bachelors,2014,Bangalore,3,32,Female,No,5,0 +Masters,2014,Bangalore,3,40,Female,No,7,1 +Bachelors,2017,New Delhi,2,33,Male,No,6,0 +Masters,2016,New Delhi,1,31,Female,No,5,1 +Bachelors,2013,Bangalore,3,35,Female,No,5,0 +Bachelors,2014,Bangalore,3,39,Male,No,7,1 +Masters,2018,Bangalore,3,39,Female,No,6,1 +Masters,2017,Pune,2,38,Female,No,2,0 +Bachelors,2012,Bangalore,3,38,Male,No,7,1 +Masters,2017,New Delhi,2,40,Female,Yes,2,0 +Bachelors,2018,Bangalore,3,38,Male,No,6,1 +Bachelors,2013,Bangalore,3,34,Male,No,6,0 +Bachelors,2012,Bangalore,1,35,Male,No,7,0 +Masters,2013,New Delhi,1,41,Male,No,5,0 +PHD,2014,New Delhi,2,37,Female,No,5,0 +Bachelors,2015,Pune,3,34,Male,Yes,7,0 +Bachelors,2014,Bangalore,3,35,Male,Yes,5,0 +Bachelors,2013,Bangalore,1,38,Male,No,6,0 +Bachelors,2016,Bangalore,3,38,Female,No,7,0 +Bachelors,2015,Pune,2,41,Female,No,7,0 +Bachelors,2018,Bangalore,3,34,Male,No,5,1 +Bachelors,2017,Pune,2,22,Male,No,0,0 +Bachelors,2018,Bangalore,2,26,Female,No,4,1 +Bachelors,2012,Bangalore,3,22,Male,No,0,0 +Bachelors,2017,New Delhi,3,25,Female,No,3,0 +Bachelors,2016,Bangalore,3,29,Male,No,0,0 +Bachelors,2017,New Delhi,3,36,Female,No,0,0 +Bachelors,2014,Bangalore,3,37,Female,No,1,0 +Bachelors,2013,New Delhi,2,34,Female,No,4,1 +Bachelors,2012,Pune,3,34,Female,No,2,1 +Bachelors,2012,Bangalore,3,25,Female,No,3,1 +Bachelors,2012,Bangalore,3,31,Male,No,0,0 +Bachelors,2015,New Delhi,3,36,Female,No,2,0 +Bachelors,2016,Bangalore,3,31,Male,Yes,5,0 +Bachelors,2015,Bangalore,3,34,Male,No,4,0 +Masters,2014,New Delhi,3,28,Male,Yes,2,1 +Bachelors,2014,Bangalore,3,28,Male,No,2,0 +Bachelors,2015,Bangalore,3,31,Male,No,1,0 +Bachelors,2017,Bangalore,3,35,Male,No,5,0 +Bachelors,2012,Bangalore,1,28,Female,Yes,1,0 +Bachelors,2018,Bangalore,3,32,Female,No,2,1 +Bachelors,2013,Bangalore,3,23,Male,Yes,1,1 +Masters,2018,Pune,3,27,Male,No,5,1 +Bachelors,2017,Pune,3,25,Male,No,3,0 +Masters,2017,New Delhi,2,31,Female,No,2,0 +PHD,2018,New Delhi,3,34,Male,No,0,1 +Bachelors,2016,Bangalore,3,36,Female,No,2,0 +PHD,2017,New Delhi,3,40,Male,No,3,0 +Masters,2012,New Delhi,3,34,Female,No,2,0 +Bachelors,2018,Bangalore,3,37,Male,No,2,1 +Bachelors,2012,Bangalore,3,38,Male,No,3,0 +Bachelors,2017,New Delhi,2,22,Female,No,0,0 +Bachelors,2016,Pune,2,36,Female,No,0,1 +Bachelors,2013,New Delhi,2,35,Female,No,1,1 +Bachelors,2012,New Delhi,3,22,Female,No,0,0 +Bachelors,2016,Bangalore,3,22,Male,No,0,0 +Bachelors,2012,Bangalore,3,29,Male,No,4,0 +Bachelors,2017,Bangalore,3,34,Male,No,5,0 +Bachelors,2017,Bangalore,2,23,Male,No,1,0 +Bachelors,2014,Pune,2,32,Male,No,3,1 +Bachelors,2012,Pune,2,26,Female,No,4,1 +Masters,2017,Bangalore,3,38,Male,No,2,0 +Bachelors,2014,Pune,3,37,Male,No,4,0 +Bachelors,2017,New Delhi,2,25,Female,No,3,0 +Bachelors,2018,Pune,2,36,Female,No,5,1 +Bachelors,2016,Bangalore,3,26,Female,No,4,0 +Bachelors,2018,Pune,2,39,Female,No,4,1 +Bachelors,2016,Bangalore,3,24,Male,No,2,1 +Masters,2018,Pune,3,39,Male,No,2,1 +Masters,2018,New Delhi,3,39,Female,No,2,1 +Bachelors,2017,New Delhi,2,27,Female,No,5,0 +Bachelors,2013,Bangalore,3,36,Male,No,5,1 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,Bangalore,3,28,Female,No,3,0 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,New Delhi,3,23,Male,No,1,0 +Bachelors,2013,Bangalore,3,30,Female,No,5,0 +Bachelors,2014,Bangalore,3,22,Male,No,0,0 +Bachelors,2014,Pune,3,27,Male,No,5,0 +Masters,2017,New Delhi,3,32,Male,No,2,0 +Masters,2014,Pune,1,33,Female,No,1,0 +Masters,2017,New Delhi,3,26,Male,No,4,1 +Bachelors,2013,Pune,3,25,Female,Yes,3,1 +Masters,2017,New Delhi,2,23,Male,No,1,1 +Bachelors,2012,Pune,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,33,Male,No,5,0 +Masters,2018,Bangalore,3,30,Male,Yes,2,1 +Masters,2017,New Delhi,2,27,Female,No,5,0 +Bachelors,2012,Pune,2,31,Female,No,5,1 +Masters,2018,New Delhi,3,23,Female,No,1,1 +Bachelors,2015,Bangalore,3,30,Male,No,2,0 +Bachelors,2015,Pune,2,32,Female,No,2,1 +Bachelors,2013,New Delhi,3,26,Female,Yes,4,0 +Masters,2017,New Delhi,2,35,Male,No,2,0 +Bachelors,2016,Bangalore,1,30,Male,No,4,1 +Bachelors,2012,Bangalore,3,37,Male,No,4,1 +Bachelors,2017,Bangalore,1,34,Male,Yes,0,0 +Bachelors,2012,Bangalore,3,38,Female,No,0,0 +Masters,2013,New Delhi,2,22,Male,Yes,0,1 +Bachelors,2015,Pune,1,22,Female,No,0,1 +Masters,2015,Pune,2,33,Female,No,2,1 +Bachelors,2015,Bangalore,3,32,Male,No,1,0 +Masters,2015,Pune,2,34,Female,No,2,0 +Bachelors,2017,Bangalore,3,36,Female,No,1,0 +Bachelors,2015,Bangalore,3,32,Male,No,1,0 +Bachelors,2017,Bangalore,3,28,Male,Yes,3,0 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2013,Pune,3,35,Male,No,1,0 +Bachelors,2014,Pune,3,33,Male,No,4,0 +Masters,2013,Pune,3,22,Female,Yes,0,1 +Bachelors,2014,Pune,3,27,Male,No,5,1 +Masters,2018,New Delhi,3,23,Female,No,1,1 +Bachelors,2013,Bangalore,3,34,Female,Yes,2,0 +Masters,2017,Pune,2,23,Male,No,1,1 +Bachelors,2012,Pune,3,36,Male,No,4,0 +PHD,2018,New Delhi,3,28,Male,No,4,1 +PHD,2013,Bangalore,3,28,Male,No,4,0 +Bachelors,2016,Bangalore,3,33,Female,No,4,0 +Bachelors,2013,Bangalore,3,39,Male,No,3,0 +Bachelors,2015,New Delhi,3,25,Female,Yes,3,0 +Bachelors,2014,Pune,3,32,Male,No,2,0 +Bachelors,2015,Pune,3,23,Female,No,1,1 +Masters,2018,New Delhi,3,29,Male,No,2,1 +Bachelors,2013,Pune,2,24,Male,No,2,1 +Bachelors,2012,Bangalore,3,36,Female,No,2,1 +Bachelors,2018,Bangalore,3,40,Male,No,4,1 +Bachelors,2012,New Delhi,3,38,Female,No,1,0 +Bachelors,2014,Bangalore,3,22,Male,No,0,0 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Bachelors,2012,Bangalore,3,37,Male,No,5,0 +Bachelors,2018,Pune,3,40,Male,No,3,1 +Bachelors,2018,Bangalore,3,32,Male,Yes,0,1 +Bachelors,2012,New Delhi,3,28,Female,No,1,0 +Bachelors,2016,Pune,3,29,Male,Yes,5,0 +Bachelors,2013,Pune,3,25,Male,No,3,0 +PHD,2013,Bangalore,3,35,Male,No,3,1 +Bachelors,2015,Bangalore,3,28,Male,No,0,1 +Bachelors,2012,Bangalore,3,39,Male,No,3,0 +Bachelors,2012,Pune,1,35,Male,No,1,0 +Bachelors,2017,Bangalore,3,37,Male,No,2,0 +Masters,2018,Pune,3,40,Female,No,2,1 +Bachelors,2018,Bangalore,3,23,Male,No,1,1 +Bachelors,2013,Pune,3,32,Male,No,2,0 +PHD,2018,New Delhi,3,37,Male,No,3,1 +Bachelors,2015,Bangalore,3,23,Female,No,1,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,36,Female,No,3,1 +Bachelors,2013,Bangalore,3,40,Female,No,3,0 +Bachelors,2015,New Delhi,3,22,Male,No,0,0 +Bachelors,2015,Bangalore,3,30,Male,No,0,0 +Bachelors,2014,Bangalore,3,30,Male,No,1,0 +Bachelors,2015,Pune,1,34,Female,No,3,1 +Bachelors,2018,Bangalore,3,27,Male,No,5,1 +Bachelors,2013,Bangalore,1,27,Female,No,5,0 +Bachelors,2017,Pune,2,27,Female,No,5,1 +Bachelors,2015,Bangalore,3,35,Female,No,1,1 +Bachelors,2014,New Delhi,3,33,Female,Yes,4,0 +Bachelors,2012,Bangalore,3,37,Male,No,4,0 +Bachelors,2014,New Delhi,3,40,Female,No,3,0 +Bachelors,2015,Pune,2,25,Female,No,3,1 +Bachelors,2017,Pune,2,34,Male,No,2,0 +Bachelors,2017,New Delhi,3,40,Male,No,1,0 +Masters,2018,New Delhi,3,34,Male,No,2,1 +Bachelors,2013,Pune,3,33,Male,No,5,0 +Bachelors,2016,Bangalore,3,22,Female,No,0,0 +Bachelors,2015,Pune,2,36,Female,No,1,1 +Bachelors,2012,Bangalore,3,38,Male,No,2,1 +Bachelors,2013,Pune,3,25,Female,No,3,0 +Bachelors,2017,Bangalore,3,37,Male,No,3,1 +Bachelors,2016,Bangalore,3,25,Female,No,3,0 +Bachelors,2015,Pune,2,40,Female,Yes,0,1 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2015,Pune,1,23,Female,No,1,0 +Bachelors,2014,Bangalore,3,22,Male,No,0,1 +Masters,2017,New Delhi,2,34,Male,Yes,2,0 +Masters,2017,New Delhi,3,35,Female,No,2,0 +Bachelors,2014,Pune,3,23,Male,No,1,0 +Bachelors,2015,Bangalore,3,29,Male,No,2,1 +Bachelors,2015,Pune,3,32,Female,No,1,0 +Bachelors,2015,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,28,Male,No,3,0 +Masters,2015,Pune,2,24,Female,No,2,0 +Bachelors,2017,Bangalore,3,33,Male,No,4,0 +PHD,2016,New Delhi,3,22,Male,No,0,0 +Masters,2015,Pune,2,39,Female,No,2,0 +Masters,2018,New Delhi,3,30,Female,Yes,2,1 +Bachelors,2014,Bangalore,3,38,Female,No,5,1 +Bachelors,2012,New Delhi,3,36,Female,No,4,0 +Bachelors,2012,Pune,2,38,Male,No,5,0 +Bachelors,2013,Bangalore,3,24,Male,Yes,2,0 +Bachelors,2016,Bangalore,3,28,Male,No,1,0 +Bachelors,2015,Bangalore,3,35,Female,No,0,1 +Bachelors,2013,New Delhi,3,23,Female,No,1,0 +Masters,2017,New Delhi,2,23,Female,No,1,1 +Bachelors,2013,Bangalore,3,37,Male,No,5,0 +Masters,2016,New Delhi,3,24,Male,No,2,1 +Bachelors,2014,Pune,3,33,Male,Yes,4,0 +Bachelors,2015,Bangalore,3,38,Female,No,5,0 +Bachelors,2015,Pune,3,40,Male,Yes,0,0 +Bachelors,2014,Bangalore,3,34,Male,No,4,0 +Masters,2017,New Delhi,2,26,Male,No,4,0 +Bachelors,2016,Pune,3,25,Male,No,3,0 +Bachelors,2016,Pune,3,24,Female,No,2,0 +Bachelors,2018,Bangalore,3,35,Male,Yes,5,1 +PHD,2013,New Delhi,3,27,Male,No,5,0 +Masters,2013,New Delhi,3,30,Female,No,3,0 +Bachelors,2015,Bangalore,3,26,Female,No,4,1 +Bachelors,2017,Bangalore,3,40,Male,No,0,0 +Masters,2017,Pune,2,27,Female,No,5,1 +Bachelors,2016,Pune,3,38,Male,Yes,0,0 +Bachelors,2014,New Delhi,3,34,Female,No,5,0 +Masters,2017,Pune,2,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,38,Male,No,4,0 +Bachelors,2014,Pune,1,37,Male,No,1,0 +Bachelors,2015,Bangalore,3,22,Male,No,0,0 +Bachelors,2014,New Delhi,3,29,Female,No,2,1 +Bachelors,2014,Pune,1,37,Female,No,4,1 +Bachelors,2016,Pune,3,23,Male,No,1,0 +Bachelors,2012,New Delhi,3,34,Female,No,2,0 +Bachelors,2017,Bangalore,3,28,Male,No,2,0 +Bachelors,2012,Pune,3,24,Male,Yes,2,0 +Masters,2017,Bangalore,2,35,Female,No,0,0 +Bachelors,2015,Bangalore,3,30,Male,No,2,0 +Bachelors,2018,Bangalore,3,33,Male,No,4,1 +Bachelors,2015,Bangalore,3,27,Female,No,5,0 +Bachelors,2016,Bangalore,3,32,Male,No,4,0 +Bachelors,2014,Pune,3,36,Female,No,5,0 +Bachelors,2012,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2012,Bangalore,1,35,Male,No,4,0 +PHD,2012,New Delhi,3,25,Male,No,3,0 +Masters,2013,Bangalore,2,29,Male,No,1,1 +Bachelors,2012,Bangalore,3,36,Female,No,3,0 +Bachelors,2013,Bangalore,3,30,Male,No,1,0 +Bachelors,2017,Pune,2,37,Female,No,4,1 +Bachelors,2016,Bangalore,3,40,Male,No,0,1 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,32,Male,No,4,0 +Bachelors,2018,Pune,3,34,Male,No,0,1 +Bachelors,2014,Pune,3,29,Male,No,3,0 +Bachelors,2012,Bangalore,3,23,Female,No,1,1 +Bachelors,2017,Pune,3,23,Male,No,1,0 +Bachelors,2013,Bangalore,3,25,Female,No,3,0 +Bachelors,2012,New Delhi,1,31,Female,No,3,0 +Masters,2017,New Delhi,2,23,Male,No,1,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +PHD,2015,New Delhi,2,39,Female,No,5,0 +Bachelors,2016,Bangalore,3,33,Female,No,1,1 +Bachelors,2013,Bangalore,3,23,Male,No,1,0 +Masters,2017,New Delhi,2,34,Female,No,4,0 +Bachelors,2015,Pune,2,37,Female,No,1,1 +Bachelors,2012,Bangalore,3,23,Male,No,1,0 +Bachelors,2017,New Delhi,3,27,Male,No,5,0 +Masters,2017,Pune,2,38,Female,No,2,0 +Bachelors,2014,Bangalore,3,27,Female,No,5,0 +Bachelors,2016,Bangalore,3,22,Male,No,0,0 +Masters,2015,Pune,2,26,Female,No,4,1 +Bachelors,2012,Bangalore,3,40,Male,No,3,0 +Bachelors,2016,Bangalore,3,33,Female,No,3,0 +Bachelors,2014,Bangalore,3,31,Male,No,0,0 +Bachelors,2017,Pune,3,33,Male,No,4,0 +Bachelors,2015,New Delhi,3,30,Male,No,5,0 +Bachelors,2015,New Delhi,3,33,Female,No,5,1 +Masters,2017,New Delhi,3,33,Female,No,0,1 +Bachelors,2016,Pune,3,22,Male,No,0,0 +Bachelors,2012,Pune,3,28,Male,No,2,0 +Bachelors,2013,Bangalore,3,36,Male,No,4,0 +Bachelors,2017,New Delhi,2,36,Female,No,1,0 +Bachelors,2014,Pune,3,31,Female,No,2,0 +Bachelors,2013,Bangalore,2,25,Male,No,3,1 +Bachelors,2012,Pune,1,31,Male,No,4,0 +Masters,2015,Pune,2,39,Female,No,0,0 +Masters,2015,Bangalore,3,26,Male,No,4,1 +Bachelors,2017,Bangalore,2,25,Female,No,3,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2013,New Delhi,3,35,Female,No,0,0 +Bachelors,2013,Pune,2,28,Male,No,5,0 +Bachelors,2012,Bangalore,3,32,Female,No,0,0 +Masters,2017,New Delhi,2,22,Male,No,0,1 +Bachelors,2014,Pune,3,36,Female,No,5,1 +Bachelors,2015,Bangalore,3,38,Male,No,1,0 +Bachelors,2014,Bangalore,3,39,Female,No,1,0 +Masters,2017,New Delhi,2,25,Female,No,3,1 +Bachelors,2016,Pune,3,27,Male,No,5,0 +Masters,2014,Pune,3,38,Male,Yes,2,0 +Bachelors,2012,New Delhi,3,22,Female,No,0,0 +Bachelors,2013,Bangalore,3,33,Male,No,2,0 +Bachelors,2013,Pune,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,37,Male,No,5,0 +Bachelors,2018,Pune,3,28,Male,Yes,0,1 +Masters,2017,Pune,3,32,Male,Yes,2,0 +PHD,2016,New Delhi,3,33,Male,No,0,1 +Bachelors,2014,New Delhi,3,32,Male,No,5,0 +Bachelors,2017,Bangalore,3,24,Male,No,2,1 +Bachelors,2016,Bangalore,3,27,Male,Yes,5,0 +Bachelors,2012,Pune,2,35,Female,No,2,1 +PHD,2013,Bangalore,3,40,Male,No,1,0 +Bachelors,2017,New Delhi,2,34,Female,No,4,0 +Bachelors,2016,New Delhi,3,39,Female,No,0,0 +Bachelors,2014,Pune,3,26,Male,No,4,0 +Masters,2015,Pune,2,29,Female,No,2,0 +Bachelors,2013,Bangalore,3,29,Male,No,4,0 +Bachelors,2015,Pune,2,23,Female,Yes,1,1 +Bachelors,2015,Pune,3,32,Male,No,0,0 +Bachelors,2014,Pune,3,28,Male,Yes,4,0 +Masters,2013,New Delhi,2,32,Male,Yes,2,1 +Bachelors,2012,New Delhi,3,32,Female,No,0,0 +Bachelors,2013,Bangalore,3,38,Male,No,0,0 +PHD,2017,Pune,3,30,Male,No,5,0 +PHD,2015,New Delhi,3,31,Male,No,3,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,1 +Bachelors,2013,Bangalore,3,37,Female,No,4,0 +Masters,2017,New Delhi,2,27,Male,No,5,1 +Bachelors,2013,New Delhi,3,25,Female,No,3,0 +Bachelors,2015,Pune,2,22,Female,No,0,1 +Bachelors,2018,Bangalore,3,38,Male,No,2,1 +Bachelors,2015,New Delhi,3,22,Male,No,0,0 +Bachelors,2017,Pune,3,38,Male,No,2,0 +PHD,2015,New Delhi,1,38,Male,No,5,0 +Bachelors,2016,New Delhi,2,26,Female,No,4,1 +Masters,2017,New Delhi,2,31,Male,No,4,0 +Masters,2014,New Delhi,3,28,Male,No,5,0 +PHD,2017,New Delhi,3,34,Female,No,3,0 +Masters,2013,Bangalore,3,31,Male,No,2,0 +Bachelors,2014,New Delhi,3,26,Female,No,4,0 +Bachelors,2013,Pune,3,40,Female,No,1,1 +Bachelors,2016,Bangalore,3,31,Male,No,0,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Bachelors,2018,Pune,3,32,Female,No,1,1 +Bachelors,2012,Bangalore,3,33,Female,No,5,0 +Bachelors,2017,Bangalore,3,25,Male,No,3,0 +Bachelors,2017,Bangalore,3,40,Male,No,0,0 +Masters,2013,New Delhi,3,31,Male,No,2,1 +Bachelors,2015,Bangalore,3,36,Male,No,1,0 +Bachelors,2014,Bangalore,3,31,Male,No,5,0 +Bachelors,2015,Pune,3,22,Male,No,0,0 +Bachelors,2016,Bangalore,3,34,Female,No,0,0 +PHD,2018,New Delhi,3,38,Female,No,5,1 +Bachelors,2015,Bangalore,3,23,Male,Yes,1,0 +PHD,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Bangalore,3,34,Male,No,1,0 +Bachelors,2012,Bangalore,3,39,Male,No,3,0 +Bachelors,2018,Bangalore,3,24,Male,Yes,2,1 +Bachelors,2015,Pune,3,37,Female,No,1,1 +PHD,2013,New Delhi,3,23,Male,No,1,0 +Bachelors,2018,Bangalore,3,36,Male,No,3,1 +Bachelors,2014,New Delhi,3,23,Male,No,1,0 +Bachelors,2012,Pune,3,31,Male,No,3,0 +Bachelors,2015,Bangalore,3,22,Male,No,0,0 +Bachelors,2015,Pune,2,24,Female,No,2,1 +Bachelors,2018,Pune,2,28,Female,No,4,1 +Bachelors,2014,Pune,3,33,Male,No,3,0 +Bachelors,2018,Bangalore,3,35,Female,No,2,1 +Bachelors,2012,New Delhi,3,30,Female,Yes,1,0 +Bachelors,2014,Bangalore,3,28,Female,No,3,0 +Bachelors,2015,Bangalore,3,22,Male,Yes,0,0 +Bachelors,2014,Bangalore,3,38,Male,No,3,0 +Bachelors,2014,Pune,3,39,Male,No,4,0 +PHD,2012,Bangalore,1,38,Male,No,5,0 +Bachelors,2014,Bangalore,3,22,Female,No,0,1 +Bachelors,2014,New Delhi,3,36,Female,No,5,0 +Bachelors,2015,Bangalore,3,27,Male,No,5,0 +Bachelors,2016,Pune,1,32,Male,No,2,0 +Bachelors,2017,New Delhi,2,39,Female,No,2,0 +Bachelors,2015,Pune,2,36,Male,No,5,0 +Bachelors,2018,Bangalore,3,34,Male,Yes,5,1 +Bachelors,2015,Bangalore,3,28,Male,No,1,0 +Bachelors,2018,Bangalore,3,36,Female,Yes,1,1 +PHD,2015,New Delhi,3,22,Female,No,0,0 +Bachelors,2014,New Delhi,1,28,Female,No,5,0 +Bachelors,2016,Pune,2,27,Female,No,5,1 +Bachelors,2014,Bangalore,1,39,Female,No,4,0 +Bachelors,2012,Bangalore,3,31,Male,No,0,0 +Bachelors,2013,Bangalore,3,26,Male,Yes,4,0 +Bachelors,2012,Bangalore,3,31,Male,No,3,0 +Bachelors,2015,Pune,2,33,Female,No,2,1 +Bachelors,2017,Pune,2,38,Female,No,1,1 +Bachelors,2014,Pune,3,38,Male,No,2,0 +Bachelors,2012,Pune,3,32,Male,No,3,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Masters,2017,Pune,2,33,Female,No,2,0 +Bachelors,2015,Bangalore,3,34,Female,No,2,0 +Bachelors,2018,Pune,3,36,Male,Yes,1,1 +Bachelors,2014,Bangalore,3,27,Male,No,5,0 +Masters,2017,Pune,2,27,Male,No,5,0 +Bachelors,2017,New Delhi,2,40,Female,No,5,0 +Masters,2012,Bangalore,3,31,Female,No,4,0 +Bachelors,2014,Bangalore,3,22,Male,No,0,0 +Masters,2017,New Delhi,2,22,Male,No,0,1 +Bachelors,2016,New Delhi,3,26,Female,No,4,0 +Bachelors,2017,New Delhi,3,28,Female,No,1,1 +Bachelors,2014,Bangalore,3,38,Male,Yes,5,0 +Masters,2015,Pune,3,31,Male,No,0,0 +Bachelors,2016,Bangalore,3,24,Male,No,2,0 +Bachelors,2015,Pune,2,25,Male,No,3,1 +PHD,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,40,Male,No,1,0 +Bachelors,2018,Pune,2,34,Female,No,4,1 +Bachelors,2016,Bangalore,3,32,Male,No,0,0 +Bachelors,2014,Pune,3,37,Male,No,1,0 +Bachelors,2015,Bangalore,3,33,Male,No,3,1 +Bachelors,2016,Pune,3,27,Male,No,5,0 +Bachelors,2012,New Delhi,3,36,Male,No,3,0 +Bachelors,2013,Bangalore,3,30,Female,No,4,0 +Masters,2017,Pune,2,26,Female,No,4,0 +Bachelors,2012,Bangalore,3,23,Male,Yes,1,0 +Masters,2015,Pune,2,31,Female,No,2,0 +Bachelors,2013,Bangalore,3,22,Male,Yes,0,0 +Masters,2017,New Delhi,2,24,Female,No,2,1 +Bachelors,2016,Bangalore,3,37,Female,Yes,4,0 +Masters,2018,New Delhi,3,35,Male,No,2,1 +Bachelors,2013,Bangalore,3,22,Male,No,0,1 +Bachelors,2012,Pune,3,35,Male,No,5,0 +Bachelors,2014,New Delhi,3,30,Female,No,3,0 +Bachelors,2014,Bangalore,3,30,Male,No,0,0 +Bachelors,2014,Pune,3,29,Male,No,3,0 +Masters,2017,Bangalore,3,36,Male,No,4,1 +Bachelors,2014,Bangalore,3,37,Male,No,4,0 +Bachelors,2016,Pune,3,40,Male,No,2,0 +Bachelors,2015,Pune,2,26,Female,No,4,1 +Masters,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2017,Bangalore,3,38,Male,No,3,0 +Bachelors,2014,Bangalore,3,31,Male,No,3,1 +Bachelors,2014,Bangalore,3,22,Female,No,0,0 +Bachelors,2012,Pune,3,34,Male,No,0,0 +Bachelors,2015,New Delhi,3,31,Female,No,0,0 +Bachelors,2012,Bangalore,3,39,Female,No,3,0 +Masters,2018,New Delhi,3,33,Female,No,2,1 +Bachelors,2015,Bangalore,3,33,Male,No,4,0 +Bachelors,2012,Bangalore,3,38,Male,No,4,0 +Bachelors,2017,Pune,2,22,Female,No,0,1 +Bachelors,2014,Pune,2,32,Female,No,0,1 +Bachelors,2014,Pune,3,34,Male,No,5,0 +Bachelors,2014,Bangalore,1,31,Female,No,5,0 +Bachelors,2016,Bangalore,3,23,Male,No,1,0 +Bachelors,2013,Pune,2,39,Female,No,1,1 +Bachelors,2017,New Delhi,3,26,Male,No,4,0 +Bachelors,2013,Pune,2,33,Female,Yes,4,1 +Bachelors,2013,Bangalore,3,27,Female,No,5,0 +PHD,2018,New Delhi,3,24,Male,No,2,1 +Bachelors,2017,Bangalore,3,38,Male,No,1,0 +Bachelors,2017,Bangalore,3,27,Male,No,5,0 +Bachelors,2014,Bangalore,3,27,Female,No,5,0 +Bachelors,2015,Bangalore,3,23,Male,No,1,0 +Bachelors,2014,New Delhi,3,26,Female,No,4,0 +Bachelors,2016,Bangalore,3,31,Male,No,5,0 +Bachelors,2017,Bangalore,3,32,Female,No,3,0 +Bachelors,2015,Pune,2,36,Female,No,3,1 +Bachelors,2017,Bangalore,3,28,Male,No,0,0 +Bachelors,2017,New Delhi,2,31,Male,No,3,0 +Masters,2017,New Delhi,2,36,Female,No,3,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,1 +Bachelors,2017,Bangalore,3,28,Male,No,3,1 +Bachelors,2015,Pune,3,39,Female,No,2,1 +Bachelors,2013,Bangalore,3,23,Female,No,1,0 +Bachelors,2014,Bangalore,3,32,Male,No,1,0 +Masters,2013,New Delhi,3,33,Female,No,2,0 +Bachelors,2017,New Delhi,3,39,Female,No,4,0 +Masters,2017,Bangalore,2,24,Female,No,2,0 +Bachelors,2016,Pune,3,33,Male,No,2,0 +Bachelors,2016,Pune,2,29,Female,No,4,1 +Masters,2017,Pune,3,24,Female,No,2,1 +Masters,2015,Pune,3,27,Female,No,5,1 +Masters,2013,New Delhi,2,35,Female,No,2,1 +Bachelors,2015,Pune,2,28,Female,No,2,1 +Bachelors,2016,Bangalore,3,22,Male,No,0,0 +Bachelors,2013,Bangalore,3,39,Male,No,5,1 +Bachelors,2014,Bangalore,3,36,Female,No,3,1 +Bachelors,2017,New Delhi,2,40,Female,No,3,0 +Bachelors,2012,New Delhi,3,35,Female,No,5,0 +Bachelors,2016,Bangalore,3,33,Male,No,4,0 +PHD,2018,Bangalore,3,33,Male,No,2,1 +Bachelors,2012,Bangalore,3,23,Male,No,1,0 +Bachelors,2014,Bangalore,3,28,Male,No,2,1 +Bachelors,2016,Bangalore,3,27,Male,No,5,0 +Bachelors,2017,Bangalore,3,26,Female,No,4,0 +Bachelors,2014,Bangalore,3,33,Male,No,3,0 +Bachelors,2016,Bangalore,3,35,Male,No,3,0 +Bachelors,2013,Bangalore,3,33,Male,No,3,1 +Bachelors,2013,Pune,3,36,Female,No,0,1 +Bachelors,2015,New Delhi,3,26,Male,No,4,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Bachelors,2014,Bangalore,3,39,Female,No,5,0 +Bachelors,2013,Bangalore,3,28,Male,No,5,0 +Bachelors,2018,Bangalore,3,24,Male,No,2,1 +Bachelors,2012,Bangalore,3,36,Female,No,4,0 +Bachelors,2016,Bangalore,3,33,Male,No,0,0 +Bachelors,2013,Pune,1,33,Female,No,0,1 +Masters,2017,Pune,2,30,Male,Yes,2,1 +Masters,2012,New Delhi,3,27,Male,No,5,1 +Bachelors,2015,Bangalore,3,33,Male,Yes,4,0 +Bachelors,2016,Pune,2,35,Female,No,4,1 +Bachelors,2014,Pune,2,40,Female,No,0,1 +Bachelors,2017,Pune,2,25,Male,No,3,0 +Bachelors,2014,Bangalore,3,38,Male,No,2,0 +Bachelors,2017,New Delhi,2,40,Male,No,5,0 +Bachelors,2014,Bangalore,3,29,Male,Yes,0,0 +Bachelors,2012,Bangalore,3,27,Male,No,5,0 +Bachelors,2015,Bangalore,3,40,Male,No,4,0 +Masters,2017,New Delhi,2,25,Female,No,3,1 +Bachelors,2016,Pune,2,39,Female,No,3,1 +Bachelors,2017,New Delhi,2,22,Male,No,0,1 +PHD,2015,Pune,2,35,Female,No,0,0 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2014,New Delhi,2,25,Female,No,3,1 +Bachelors,2015,Bangalore,3,29,Female,No,1,0 +Masters,2017,New Delhi,1,37,Male,No,0,0 +Bachelors,2014,Bangalore,3,35,Male,No,1,0 +Bachelors,2012,Bangalore,3,26,Male,No,4,0 +Masters,2018,New Delhi,3,26,Male,No,4,1 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2014,Bangalore,3,31,Male,No,0,0 +Bachelors,2014,Bangalore,3,34,Male,No,5,0 +Masters,2018,New Delhi,3,27,Female,Yes,5,1 +Bachelors,2016,Pune,3,35,Male,No,1,0 +Bachelors,2017,Pune,3,27,Male,No,5,0 +Masters,2017,New Delhi,3,34,Male,No,1,1 +Bachelors,2018,Bangalore,3,40,Female,No,4,1 +Bachelors,2012,Pune,3,39,Male,No,4,0 +Bachelors,2013,Pune,1,39,Female,Yes,0,1 +Bachelors,2015,Bangalore,3,22,Male,No,0,1 +Masters,2017,Pune,2,33,Male,Yes,2,0 +Bachelors,2014,Bangalore,3,39,Male,No,0,0 +Bachelors,2017,Bangalore,3,39,Male,No,3,0 +Bachelors,2017,Bangalore,3,40,Female,No,3,0 +Bachelors,2014,Bangalore,3,38,Female,No,1,0 +Bachelors,2018,New Delhi,3,36,Female,Yes,2,1 +Bachelors,2013,Pune,2,37,Male,Yes,5,0 +Bachelors,2017,Pune,2,33,Female,No,2,1 +Bachelors,2013,Bangalore,3,37,Female,No,2,1 +Bachelors,2013,Pune,3,34,Male,No,5,0 +Bachelors,2015,Bangalore,3,28,Male,No,2,0 +Bachelors,2018,Bangalore,3,31,Male,Yes,0,1 +Masters,2012,New Delhi,3,37,Male,No,4,0 +Bachelors,2018,Pune,3,26,Male,No,4,1 +Masters,2014,New Delhi,3,34,Female,No,1,1 +Bachelors,2015,Pune,3,39,Male,No,1,0 +Bachelors,2017,Pune,2,23,Female,No,1,1 +Bachelors,2013,Bangalore,3,35,Female,No,4,0 +Bachelors,2015,Pune,3,25,Male,No,3,0 +Bachelors,2013,Pune,2,38,Male,No,0,1 +Masters,2017,New Delhi,1,23,Male,No,1,0 +Masters,2017,New Delhi,3,26,Male,No,4,1 +Masters,2018,New Delhi,3,33,Female,No,2,1 +Bachelors,2015,Pune,2,37,Female,No,4,1 +Bachelors,2013,Bangalore,3,35,Male,No,5,0 +Bachelors,2013,Bangalore,3,23,Female,Yes,1,0 +Bachelors,2013,Pune,3,31,Male,No,2,0 +Bachelors,2017,Bangalore,3,24,Male,Yes,2,0 +Bachelors,2015,Bangalore,3,28,Male,No,3,0 +Bachelors,2013,Pune,2,37,Female,No,0,1 +Bachelors,2012,Bangalore,3,36,Female,No,1,0 +Bachelors,2015,Bangalore,3,28,Male,No,1,1 +Bachelors,2017,New Delhi,2,30,Male,No,5,0 +Bachelors,2014,Bangalore,3,26,Male,No,4,0 +Masters,2015,Pune,2,29,Female,No,1,0 +Masters,2018,New Delhi,3,39,Female,No,2,1 +Bachelors,2013,Pune,2,36,Male,No,4,0 +Bachelors,2015,Pune,3,36,Male,No,3,0 +Bachelors,2012,Bangalore,3,22,Male,No,0,1 +Masters,2017,New Delhi,3,31,Male,No,2,0 +PHD,2017,New Delhi,3,29,Male,No,3,0 +Bachelors,2014,Pune,3,37,Female,No,4,1 +Bachelors,2012,Bangalore,3,24,Male,No,2,0 +Bachelors,2015,Pune,2,28,Female,Yes,2,1 +PHD,2016,New Delhi,3,22,Male,No,0,0 +Bachelors,2015,Bangalore,3,31,Male,No,2,1 +Bachelors,2013,Pune,2,28,Female,No,3,1 +Bachelors,2014,Bangalore,3,22,Female,No,0,0 +Bachelors,2016,Bangalore,3,23,Male,No,1,0 +Bachelors,2016,New Delhi,1,25,Female,Yes,3,0 +Bachelors,2013,Pune,1,23,Female,No,1,1 +Bachelors,2017,New Delhi,2,26,Female,No,4,0 +Bachelors,2015,Pune,2,22,Female,No,0,1 +Bachelors,2015,Bangalore,3,38,Female,No,2,0 +Bachelors,2017,Bangalore,3,25,Female,No,3,0 +Bachelors,2017,New Delhi,3,37,Female,No,1,1 +PHD,2012,New Delhi,3,30,Male,No,4,0 +Bachelors,2012,Bangalore,3,35,Female,No,2,0 +PHD,2014,Bangalore,3,23,Male,No,1,0 +Masters,2017,New Delhi,2,25,Female,No,3,0 +Bachelors,2015,Bangalore,3,39,Female,No,0,0 +PHD,2013,Pune,1,32,Female,No,0,1 +Bachelors,2015,Pune,3,28,Female,No,1,1 +Bachelors,2015,New Delhi,3,23,Female,No,1,0 +PHD,2014,Bangalore,1,34,Female,No,3,0 +Bachelors,2014,Bangalore,1,36,Female,No,1,0 +Bachelors,2017,Bangalore,3,40,Male,No,5,0 +Bachelors,2016,Bangalore,3,40,Male,No,3,0 +Bachelors,2015,Bangalore,3,25,Female,No,3,1 +Bachelors,2013,Bangalore,3,22,Male,No,0,1 +Bachelors,2015,Bangalore,3,34,Male,No,4,0 +Bachelors,2017,Bangalore,3,23,Male,No,1,0 +Bachelors,2017,Bangalore,3,24,Female,No,2,0 +Bachelors,2015,Bangalore,1,35,Male,No,3,0 +Bachelors,2014,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,Pune,3,28,Male,No,3,0 +Masters,2017,New Delhi,2,39,Female,No,4,0 +PHD,2017,New Delhi,3,31,Female,No,5,0 +Bachelors,2014,Bangalore,3,32,Male,No,2,0 +Bachelors,2017,New Delhi,2,37,Female,No,3,0 +Bachelors,2014,Pune,1,22,Female,No,0,1 +Bachelors,2015,Bangalore,3,32,Female,No,4,0 +Bachelors,2016,Bangalore,3,37,Male,No,2,0 +Bachelors,2014,Bangalore,3,36,Male,No,3,0 +Bachelors,2013,Pune,3,24,Male,Yes,2,0 +Masters,2017,New Delhi,3,40,Male,No,2,0 +Bachelors,2014,Bangalore,3,39,Male,No,3,0 +Bachelors,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2016,Bangalore,3,25,Male,No,3,0 +Bachelors,2018,Bangalore,3,26,Male,No,4,1 +Bachelors,2017,New Delhi,2,33,Male,No,3,0 +Bachelors,2016,Pune,3,36,Male,Yes,3,0 +Bachelors,2015,Pune,1,39,Male,No,1,1 +Bachelors,2014,Bangalore,3,34,Male,No,4,0 +Bachelors,2014,New Delhi,2,23,Female,No,1,1 +Bachelors,2014,Pune,1,33,Female,No,2,1 +Bachelors,2013,Bangalore,3,31,Male,No,3,0 +Bachelors,2015,Bangalore,3,39,Female,No,0,0 +Bachelors,2017,Bangalore,3,36,Male,No,4,1 +Bachelors,2015,Bangalore,3,28,Male,No,1,0 +Bachelors,2013,New Delhi,3,28,Female,No,0,1 +Masters,2017,New Delhi,2,24,Male,No,2,1 +Bachelors,2013,Bangalore,3,36,Female,No,0,1 +Bachelors,2014,Bangalore,3,30,Male,No,1,1 +Bachelors,2018,New Delhi,3,27,Female,No,5,1 +Bachelors,2012,Bangalore,3,25,Male,No,3,0 +Bachelors,2018,Bangalore,3,31,Male,No,0,1 +Bachelors,2013,Bangalore,3,36,Male,No,0,0 +Bachelors,2017,New Delhi,2,31,Male,No,1,0 +Bachelors,2016,Bangalore,3,37,Male,No,2,0 +Bachelors,2015,Bangalore,3,39,Male,No,2,0 +Bachelors,2014,Bangalore,3,28,Male,No,4,0 +Bachelors,2015,Pune,2,38,Male,No,2,1 +Masters,2017,New Delhi,3,40,Female,No,1,0 +Masters,2015,Bangalore,3,38,Female,No,1,0 +PHD,2014,New Delhi,3,23,Male,No,1,0 +Bachelors,2015,Bangalore,3,39,Male,No,2,0 +Bachelors,2014,Pune,1,22,Female,No,0,1 +Bachelors,2015,Pune,3,24,Female,No,2,1 +Masters,2014,New Delhi,3,24,Male,No,2,0 +Bachelors,2012,Bangalore,3,23,Female,No,1,1 +Bachelors,2014,Bangalore,3,30,Male,No,4,0 +Bachelors,2016,New Delhi,3,25,Female,No,3,0 +Bachelors,2013,Bangalore,3,34,Male,No,4,0 +Masters,2015,New Delhi,3,40,Female,No,5,0 +Bachelors,2012,Bangalore,3,39,Female,No,1,0 +Masters,2017,New Delhi,3,38,Female,No,2,1 +Bachelors,2016,Pune,3,38,Male,No,2,0 +Bachelors,2015,Pune,2,38,Female,No,4,1 +Bachelors,2015,Bangalore,3,31,Male,No,5,0 +Bachelors,2017,Pune,1,30,Male,No,4,0 +PHD,2013,Bangalore,3,24,Male,No,2,0 +Bachelors,2017,Bangalore,3,38,Male,No,3,0 +Bachelors,2013,Pune,3,37,Male,No,3,0 +Bachelors,2016,Bangalore,3,22,Male,No,0,0 +PHD,2012,Bangalore,3,30,Female,No,4,0 +Bachelors,2013,Bangalore,3,39,Female,No,5,0 +Bachelors,2017,Bangalore,2,35,Male,No,0,0 +Bachelors,2012,Pune,3,25,Female,No,3,1 +Bachelors,2018,Bangalore,3,32,Male,Yes,1,1 +Bachelors,2018,Bangalore,3,31,Female,No,2,1 +Bachelors,2016,Bangalore,3,37,Male,No,2,0 +Bachelors,2016,New Delhi,1,38,Female,No,2,1 +Bachelors,2014,Bangalore,3,22,Female,No,0,0 +Masters,2014,New Delhi,3,37,Female,No,0,1 +Bachelors,2018,Bangalore,3,32,Male,Yes,2,1 +Bachelors,2013,Bangalore,3,26,Male,No,4,0 +Bachelors,2017,Bangalore,3,28,Male,No,0,1 +Bachelors,2015,Bangalore,3,35,Male,No,0,0 +Bachelors,2016,Bangalore,1,33,Female,No,0,1 +Bachelors,2012,Bangalore,3,36,Female,No,4,0 +Bachelors,2013,Bangalore,3,31,Female,No,5,0 +Bachelors,2015,Pune,3,32,Female,Yes,1,1 +Masters,2017,Pune,2,31,Female,No,2,0 +Bachelors,2013,Bangalore,3,25,Female,No,3,0 +Bachelors,2016,Pune,3,30,Male,No,2,0 +Bachelors,2013,Bangalore,3,26,Female,No,4,0 +Masters,2013,Pune,2,37,Male,No,2,1 +Masters,2018,New Delhi,3,27,Male,No,5,1 +Bachelors,2012,Bangalore,3,30,Male,Yes,2,0 +Bachelors,2015,Bangalore,3,33,Male,Yes,4,0 diff --git a/evadb/configuration/constants.py b/evadb/configuration/constants.py index 18a1331f83..3665a28727 100644 --- a/evadb/configuration/constants.py +++ b/evadb/configuration/constants.py @@ -35,3 +35,4 @@ DEFAULT_DOCUMENT_CHUNK_SIZE = 4000 DEFAULT_DOCUMENT_CHUNK_OVERLAP = 200 DEFAULT_TRAIN_REGRESSION_METRIC = "rmse" +DEFAULT_XGBOOST_TASK = "regression" diff --git a/evadb/executor/create_function_executor.py b/evadb/executor/create_function_executor.py index d045205a65..9f5d46e8be 100644 --- a/evadb/executor/create_function_executor.py +++ b/evadb/executor/create_function_executor.py @@ -30,6 +30,7 @@ from evadb.configuration.constants import ( DEFAULT_TRAIN_REGRESSION_METRIC, DEFAULT_TRAIN_TIME_LIMIT, + DEFAULT_XGBOOST_TASK, EvaDB_INSTALLATION_DIR, ) from evadb.database import EvaDBDatabase @@ -238,7 +239,7 @@ def handle_xgboost_function(self): "time_budget": arg_map.get("time_limit", DEFAULT_TRAIN_TIME_LIMIT), "metric": arg_map.get("metric", DEFAULT_TRAIN_REGRESSION_METRIC), "estimator_list": ["xgboost"], - "task": "regression", + "task": arg_map.get("task", DEFAULT_XGBOOST_TASK), } model.fit( dataframe=aggregated_batch.frames, label=arg_map["predict"], **settings diff --git a/test/integration_tests/long/test_model_train.py b/test/integration_tests/long/test_model_train.py index 85e508f4d1..d1e9de11e8 100644 --- a/test/integration_tests/long/test_model_train.py +++ b/test/integration_tests/long/test_model_train.py @@ -47,6 +47,25 @@ def setUpClass(cls): load_query = f"LOAD CSV '{path}' INTO HomeRentals;" execute_query_fetch_all(cls.evadb, load_query) + # Load data for classification tasks. + create_table_query = """ + CREATE TABLE IF NOT EXISTS Employee ( + education TEXT(128), + joining_year INTEGER, + city TEXT(128), + payment_tier INTEGER, + age INTEGER, + gender TEXT(128), + ever_benched TEXT(128), + experience_in_current_domain INTEGER, + leave_or_not INTEGER + );""" + execute_query_fetch_all(cls.evadb, create_table_query) + + path = f"{EvaDB_ROOT_DIR}/data/classification/Employee.csv" + load_query = f"LOAD CSV '{path}' INTO Employee;" + execute_query_fetch_all(cls.evadb, load_query) + @classmethod def tearDownClass(cls): shutdown_ray() @@ -103,7 +122,8 @@ def test_xgboost_regression(self): TYPE XGBoost PREDICT 'rental_price' TIME_LIMIT 180 - METRIC 'r2'; + METRIC 'r2' + TASK 'regression'; """ execute_query_fetch_all(self.evadb, create_predict_function) @@ -114,6 +134,27 @@ def test_xgboost_regression(self): self.assertEqual(len(result.columns), 1) self.assertEqual(len(result), 10) + @xgboost_skip_marker + def test_xgboost_classification(self): + create_predict_function = """ + CREATE FUNCTION IF NOT EXISTS PredictEmployee FROM + ( SELECT payment_tier, age, gender, experience_in_current_domain, leave_or_not FROM Employee ) + TYPE XGBoost + PREDICT 'leave_or_not' + TIME_LIMIT 180 + METRIC 'accuracy' + TASK 'classification'; + """ + execute_query_fetch_all(self.evadb, create_predict_function) + + predict_query = """ + SELECT PredictEmployee(payment_tier, age, gender, experience_in_current_domain, leave_or_not) FROM Employee LIMIT 10; + """ + result = execute_query_fetch_all(self.evadb, predict_query) + print(result) + self.assertEqual(len(result.columns), 1) + self.assertEqual(len(result), 10) + if __name__ == "__main__": unittest.main() From 0ab5ff85dcb545f395be5f04e7bf84b0e7e2e26a Mon Sep 17 00:00:00 2001 From: Jineet Desai Date: Thu, 19 Oct 2023 16:48:59 -0400 Subject: [PATCH 13/64] Adding doc changes --- .../reference/ai/model-train-xgboost.rst | 40 ++++++++++++++++++- .../long/test_model_train.py | 1 - 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/docs/source/reference/ai/model-train-xgboost.rst b/docs/source/reference/ai/model-train-xgboost.rst index b53c87d489..4f2c18ddde 100644 --- a/docs/source/reference/ai/model-train-xgboost.rst +++ b/docs/source/reference/ai/model-train-xgboost.rst @@ -23,4 +23,42 @@ To use the `Flaml XGBoost AutoML framework Date: Mon, 23 Oct 2023 19:58:01 -0400 Subject: [PATCH 14/64] Added note --- docs/source/overview/connect-to-data-sources.rst | 4 +--- docs/source/reference/databases/sqlite.rst | 4 +++- docs/source/usecases/classification.rst | 4 ++++ docs/source/usecases/forecasting.rst | 4 ++++ docs/source/usecases/sentiment-analysis.rst | 4 ++++ 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/source/overview/connect-to-data-sources.rst b/docs/source/overview/connect-to-data-sources.rst index 8f7526ae36..e89adcfeec 100644 --- a/docs/source/overview/connect-to-data-sources.rst +++ b/docs/source/overview/connect-to-data-sources.rst @@ -8,9 +8,7 @@ Connect to an Existing SQL Database System .. note:: - Connecting to an existing SQL database is unnecessary for inserting or querying data in Eva. This step is only required if - users intend to work with data already present in some SQL DB. Eva has native storage support for SQLite, which can be utilized without - establishing any connection. Refer to :ref:`EvaQL` page for more details. + For prototyping, users can opt to establish a connection to :ref:`SQLite`. 1. Use the :ref:`CREATE DATABASE` statement to connect to an **existing** SQL database. diff --git a/docs/source/reference/databases/sqlite.rst b/docs/source/reference/databases/sqlite.rst index af90051009..49fc63d187 100644 --- a/docs/source/reference/databases/sqlite.rst +++ b/docs/source/reference/databases/sqlite.rst @@ -1,3 +1,5 @@ +.. _sqlite: + SQLite ========== @@ -16,7 +18,7 @@ Required: * `database` is the path to the database file to be opened. You can pass ":memory:" to create an SQLite database existing only in memory, and open a connection to it. -.. warning:: +.. note:: If the ``database`` parameter is specified, EvaDB connects to the already existing ``sqlite`` database specified. Otherwise, it automatically creates a new ``sqlite`` database named ``evadb.db``. diff --git a/docs/source/usecases/classification.rst b/docs/source/usecases/classification.rst index a1fb192d92..1fbb2823d9 100644 --- a/docs/source/usecases/classification.rst +++ b/docs/source/usecases/classification.rst @@ -31,6 +31,10 @@ In this tutorial, we present how to to create and train a machine learning model We will assume that the input data is loaded into a ``PostgreSQL`` database. To load the home rental data into your database, see the complete `home rental prediction notebook on Colab `_. +.. note:: + + For prototyping, users can opt to establish a connection to :ref:`SQLite`. + Preview the Home Rental Price Data ---------------------------------- diff --git a/docs/source/usecases/forecasting.rst b/docs/source/usecases/forecasting.rst index 8f7bb8575b..d6f1b62bc4 100644 --- a/docs/source/usecases/forecasting.rst +++ b/docs/source/usecases/forecasting.rst @@ -31,6 +31,10 @@ In this tutorial, we present how to create and train a machine learning model fo We will assume that the input data is loaded into a ``PostgreSQL`` database. To load the home sales dataset into your database, see the complete `home sale forecasting notebook on Colab `_. +.. note:: + + For prototyping, users can opt to establish a connection to :ref:`SQLite`. + Preview the Home Sale Price Data -------------------------------- diff --git a/docs/source/usecases/sentiment-analysis.rst b/docs/source/usecases/sentiment-analysis.rst index a7dfeb2d98..74d6eade77 100644 --- a/docs/source/usecases/sentiment-analysis.rst +++ b/docs/source/usecases/sentiment-analysis.rst @@ -31,6 +31,10 @@ To load the food review data into your database, see the complete `sentiment ana .. include:: ../shared/postgresql.rst +.. note:: + + For prototyping, users can opt to establish a connection to :ref:`SQLite`. + Sentiment Analysis of Reviews using ChatGPT ------------------------------------------- From d25b22876e28b78c45b95351b5708d7505213a50 Mon Sep 17 00:00:00 2001 From: Ankith Reddy Chitti Date: Mon, 23 Oct 2023 19:59:12 -0400 Subject: [PATCH 15/64] Minor Fix --- docs/source/overview/connect-to-data-sources.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/overview/connect-to-data-sources.rst b/docs/source/overview/connect-to-data-sources.rst index e89adcfeec..e3ae055683 100644 --- a/docs/source/overview/connect-to-data-sources.rst +++ b/docs/source/overview/connect-to-data-sources.rst @@ -6,10 +6,6 @@ EvaDB supports a wide range of data sources including SQL database systems, obje Connect to an Existing SQL Database System ------------------------------------------ -.. note:: - - For prototyping, users can opt to establish a connection to :ref:`SQLite`. - 1. Use the :ref:`CREATE DATABASE` statement to connect to an **existing** SQL database. .. code-block:: @@ -28,6 +24,10 @@ Connect to an Existing SQL Database System Go over the :ref:`CREATE DATABASE` statement for more details. The :ref:`Databases` page lists all the database systems that EvaDB currently supports. +.. note:: + + For prototyping, users can opt to establish a connection to :ref:`SQLite`. + 2. Preview the data using ``SELECT`` You can now preview the data stored in the ``food_review`` table in the ``restaurant_reviews`` database with a :ref:`SELECT