{ "info": { "author": "MIT Data To AI Lab", "author_email": "dailabmit@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "

\n\u201cSDV\u201d\nAn open source project from Data to AI Lab at MIT.\n

\n\n[![PyPi][pypi-img]][pypi-url]\n[![Travis][travis-img]][travis-url]\n[![CodeCov][codecov-img]][codecov-url]\n[![Downloads][downloads-img]][downloads-url]\n\n[pypi-img]: https://img.shields.io/pypi/v/sdv.svg\n[pypi-url]: https://pypi.python.org/pypi/sdv\n[travis-img]: https://travis-ci.org/HDI-Project/SDV.svg?branch=master\n[travis-url]: https://travis-ci.org/HDI-Project/SDV\n[codecov-img]: https://codecov.io/gh/HDI-Project/SDV/branch/master/graph/badge.svg\n[codecov-url]: https://codecov.io/gh/HDI-Project/SDV\n[downloads-img]: https://pepy.tech/badge/sdv\n[downloads-url]: https://pepy.tech/project/sdv\n\n# SDV - Synthetic Data Vault\n\nAutomated generative modeling and sampling\n\n- Free software: MIT license\n- Documentation: https://HDI-Project.github.io/SDV\n\n## Overview\n\nThe goal of the Synthetic Data Vault (SDV) is to allow data scientists to navigate, model and\nsample relational databases. The main access point of the library is the class `SDV`, that wraps\nthe functionality of the three core classes: the `DataNavigator`, the `Modeler` and the `Sampler`.\n\nUsing these classes, users can get easy access to information about the relational database,\ncreate generative models for tables in the database and sample rows from these models to produce\nsynthetic data.\n\n## Installation\n\n### Install with pip\n\nThe easiest way to install SDV is using `pip`\n\n```\npip install sdv\n```\n\n### Install from sources\n\nYou can also clone the repository and install it from sources\n\n```\ngit clone git@github.com:HDI-Project/SDV.git\n```\n\nAfter cloning the repository, it's recommended that you create a virtualenv.\nIn this example, we will create it using [VirtualEnvwrapper](https://virtualenvwrapper.readthedocs.io/en/latest/):\n\n```\ncd SDV\nmkvirtualenv -p $(which python3.6) -a $(pwd) sdv\n```\n\nAfter creating the virtualenv and activating it, you can install the project by runing the following command:\n\n```\nmake install\n```\n\nFor development, use the following command instead, which will install some additional dependencies for code linting and testing.\n\n```\nmake install-develop\n```\n\n## Usage Example\n\nBelow there is a short example about how to use SDV to model and sample a dataset composed of\nrelational tables.\n\n**NOTE**: In order to be able to run this example, please make sure to have cloned the repository\nand execute these commands inside it, as they rely on some of the demo data included in it.\n\n## Using the SDV class\n\nThe easiest way to use SDV in Python is using the SDV class imported from the root of the package:\n\n```python\nfrom sdv import SDV\n\ndata_vault = SDV('tests/data/meta.json')\ndata_vault.fit()\nsamples = data_vault.sample_all()\n```\n\nThe output of `SDV.sample_all` is a dictionary with the name of the tables as keys, and\n`pandas.DataFrame` with the synthesized table as values. Below we can see a few rows of each\ntable:\n\n```text\n CUSTOMER_ID CUST_POSTAL_CODE PHONE_NUMBER1 CREDIT_LIMIT COUNTRY\n0 0 61026.0 5.410825e+09 1017.0 FRANCE\n1 1 20166.0 7.446005e+09 1316.0 US\n2 2 11371.0 8.993345e+09 1839.0 US\n\n ORDER_ID CUSTOMER_ID ORDER_TOTAL\n0 0 0 1251.0\n1 1 0 1691.0\n2 2 0 1126.0\n\n ORDER_ITEM_ID ORDER_ID PRODUCT_ID UNIT_PRICE QUANTITY\n0 0 0 9.0 20.0 0.0\n1 1 0 8.0 79.0 3.0\n2 2 0 8.0 66.0 1.0\n\n```\n\nWith this, we will be able to generate sintetic samples of data. The only argument we pass to `SDV`\nis a path to a JSON file containing the information of the different tables, their fields and\nrelations. Further explanation of how to generate this file can be found on the docs.\n\nAfter instantiating the class, we call to the `fit()` method in order to transform and model the\ndata, and after that we are ready to sample rows, tables or the whole database.\n\n## Using each class manually\n\nThe modelling and sampling process using SDV follows these steps:\n\n1. We use a `DataNavigator` instance to extract relevant information from the dataset, as well as\n to transform their contents into numeric values.\n\n2. The `DataNavigator` is then used to create a `Modeler` instance, which uses the information in\n the `DataNavigator` to create generative models of the tables.\n\n3. The `Modeler` instance can be passed to a `Sampler` to sample rows of synthetic data.\n\n### Using the DataNavigator\n\nThe `DataNavigator` can be used to extract useful information about a dataset, such as the\nrelationships between tables. Here we will use it to load the test data from the CSV files\nand apply some transformations to it.\n\nFirst, we will create an instance of `CSVDataLoader`, that will load the data and prepare it to use it with `DataNavigator`.\nTo create an instance of the `CSVDataLoader` class, the filepath to the meta.json file must be provided.\n\n```python\nfrom sdv import CSVDataLoader\ndata_loader = CSVDataLoader('tests/data/meta.json')\n```\n\nThe `load_data()` function can then be used to create an instance of a `DataNavigator`.\n\n```python\ndata_navigator = data_loader.load_data()\n```\n\nThe `DataNavigator` stores the data as a dictionary mapping the table names to a tuple of the data\nitself (represented as a `pandas.Dataframe`) and the meta information for that table. You can access\nthe data using the `DataNavigator.get_data` method:\n\n```python\ndata_navigator.get_data('DEMO_CUSTOMERS')\n```\n\nThe output of `get_data` will be a `pandas.DataFrame` containing the requested table:\n\n```text\n 0 1 2\nCUSTOMER_ID 50 4 97338810\nCUST_POSTAL_CODE 11371 63145 6096\nPHONE_NUMBER1 6175553295 8605551835 7035552143\nCREDIT_LIMIT 1000 500 1000\nCOUNTRY UK US CANADA\n```\n\nThe metadata can be accessed with the analogous method `DataNavigator.get_meta_data`:\n\n```python\ndata_navigator.get_meta_data('DEMO_CUSTOMERS')\n```\n\nThe output of this method is a `dict` with the metadata for given table:\n\n```text\n{\n 'fields': {\n 'CUSTOMER_ID': {\n 'name': 'CUSTOMER_ID',\n 'subtype': 'integer',\n 'type': 'number',\n 'uniques': 0,\n 'regex': '^[0-9]{10}$'\n },\n 'CUST_POSTAL_CODE': {\n 'name': 'CUST_POSTAL_CODE',\n 'subtype': 'integer',\n 'type': 'categorical',\n 'uniques': 0\n },\n 'PHONE_NUMBER1': {\n 'name': 'PHONE_NUMBER1',\n 'subtype': 'integer',\n 'type': 'number',\n 'uniques': 0\n },\n 'CREDIT_LIMIT': {\n 'name': 'CREDIT_LIMIT',\n 'subtype': 'integer',\n 'type': 'number',\n 'uniques': 0\n },\n 'COUNTRY': {\n 'name': 'COUNTRY',\n 'type': 'categorical',\n 'uniques': 0\n }\n },\n 'headers': True,\n 'name': 'DEMO_CUSTOMERS',\n 'path': 'customers.csv',\n 'primary_key': 'CUSTOMER_ID',\n 'use': True\n}\n```\n\nYou can also use the `DataNavigator` to get parents or children of a table.\n\n```python\ndata_navigator.get_parents('DEMO_ORDERS')\n```\n\nThe output of `get_parents` is a `set` containing the name of the parent tables.\nAnalogously, the `get_children` returns the children tables.\n\nFinally, we can use the `transform_data()` function to apply transformations from the\n[RDT library](https://github.com/HDI-Project/rdt) to our data. If no transformations are provided,\nthe function will convert all categorical types and datetime types to numeric values by default.\n\n```python\ntransformed_data = data_navigator.transform_data()\n```\n\nIt will return a dictionary mapping the table name to the transformed data represented as a\n`pandas.Dataframe`.\n\n```text\n{\n 'DEMO_CUSTOMERS':\n\n CUSTOMER_ID CUST_POSTAL_CODE PHONE_NUMBER1 CREDIT_LIMIT COUNTRY\n 0 50 0.286191 6175553295 1000 0.610635\n 1 4 0.764276 8605551835 500 0.856004\n 2 97338810 0.087041 7035552143 1000 0.015171\n 3 630407 0.828319 7035552143 2000 0.786255\n 4 826362 0.357857 6175553295 1000 0.557042\n 5 55996144 0.534755 4045553285 1000 0.213988,\n\n 'DEMO_ORDERS':\n\n ORDER_ID CUSTOMER_ID ORDER_TOTAL\n 0 1 50 2310\n 1 2 4 1507\n 2 10 97338810 730\n 3 6 55996144 730\n 4 3 55996144 939\n 5 4 50 2380,\n\n 'DEMO_ORDER_ITEMS':\n\n ORDER_ITEM_ID ORDER_ID PRODUCT_ID UNIT_PRICE QUANTITY\n 0 100 10 7 52 8\n 1 101 8 6 125 4\n 2 102 1 6 125 4\n 3 103 4 9 125 4\n 4 104 1 9 113 4\n 5 105 9 10 87 2\n}\n```\n\n### Using the Modeler\n\nThe `Modeler` can be used to recursively model the data. This is important because the tables in\nthe data have relationships between them, that should also be modeled in order to have reliable\nsampling. Let's look at the test data for example. There are three tables in this data set:\n`DEMO_CUSTOMERS`, `DEMO_ORDERS` and `DEMO_ORDER_ITEMS`.\n\n\nThe `DEMO_ORDERS` table has a field labelled `CUSTOMER_ID`, that references the \"id\" field\nof the `DEMO_CUSTOMERS` table. SDV wants to model not only the data, but these relationships as\nwell. The Modeler class is responsible for carrying out this task.\n\nTo do so, first, import from the Modeler and create an instance of the class. The Modeler must\nbe provided the DataNavigator and the type of model to use. If no model type is provided, it will\nuse a [copulas.multivariate.Gaussian Copula](https://github.com/DAI-Lab/copulas) by default. Note that in order for\nthe modeler to work, the DataNavigator must have already transformed its data.\n\n```python\nfrom sdv import Modeler\nmodeler = Modeler(data_navigator)\n```\n\nThen you can model the entire database. The `Modeler` will store models for every table in the\ndataset, but return no result.\n\n```python\nmodeler.model_database()\n```\n\nThe modeler can also be saved to a file using the `save()` method. This will save a pickle file\non the specified path.\n\n```python\nmodeler.save('demo_model.pkl')\n```\n\nIf you have stored a model in a previous session using the command above, you can load the model\nusing the `load()` method:\n\n```python\nmodeler = Modeler.load('demo_model.pkl')\n```\n\n### Using the Sampler\n\nThe `Sampler` takes in a `Modeler` and `DataNavigator`. Using the models created in the last step,\nthe `Sampler` can recursively move through the tables in the dataset, and sample synthetic data.\nIt can be used to sample rows from specified tables, sample an entire table at once or sample the\nwhole database.\n\nLet's do an example with our dataset. First import the Sampler and create an instance of\nthe class.\n\n```python\nfrom sdv import Sampler\nsampler = Sampler(data_navigator, modeler)\n```\n\nTo sample rows from a table, and their related childs, use the method `Sampler.sample_rows`.\n\n```python\nsampler.sample_rows('DEMO_CUSTOMERS', 5)\n```\n\nIt will return a `dict` with the table name as keys and a `pandas.DataFrame` containing the\nsynthesized data as values, as we can see below. Please note that not all rows are shown.\n\n```text\n{\n 'DEMO_CUSTOMERS':\n CUSTOMER_ID CUST_POSTAL_CODE PHONE_NUMBER1 CREDIT_LIMIT COUNTRY\n 0 5 63145 6286474239 1778 US\n 1 6 11371 4526647758 526 FRANCE\n 2 7 11371 6027109756 958 UK\n 3 8 63145 5712861733 1965 UK\n 4 9 11371 5728456040 1383 SPAIN,\n\n 'DEMO_ORDERS':\n ORDER_ID CUSTOMER_ID ORDER_TOTAL\n 0 11 5 1331\n 1 12 5 1952\n 2 13 5 2179\n 3 14 6 1160\n 4 15 6 1069\n 5 16 7 1090\n\n 'DEMO_ORDER_ITEMS':\n ORDER_ITEM_ID ORDER_ID PRODUCT_ID UNIT_PRICE QUANTITY\n 0 189 11 11 127 0\n 1 190 11 12 122 2\n 2 191 11 8 78 2\n 3 192 11 12 233 3\n 4 193 12 11 96 6\n 5 194 12 11 65 2\n}\n```\n\nTo sample a whole table use the method `Sampler.sample_table`. This will create as many rows as there where in the\noriginal database.\n\n```python\nsampler.sample_table('DEMO_CUSTOMERS')\n```\n\nThe output of sampe_table is a `pandas.DataFrame` containing the synthesized table:\n\n```text\n CUSTOMER_ID CUST_POSTAL_CODE PHONE_NUMBER1 CREDIT_LIMIT COUNTRY\n0 0 27937.0 8.095336e+09 1029.0 CANADA\n1 1 18183.0 2.761015e+09 891.0 CANADA\n2 2 16402.0 4.956798e+09 1313.0 SPAIN\n3 3 7116.0 8.072395e+09 1124.0 FRANCE\n4 4 368.0 4.330203e+09 1186.0 FRANCE\n5 5 64304.0 6.256936e+09 1113.0 US\n6 6 94698.0 8.271224e+09 1086.0 CANADA\n\n```\n\nFinally, the entire database can be sampled using `Sampler.sample_all(num_rows)`. The `num_rows`\nparameter specifies how many parent rows generate, the amount of child rows will be sampled based\non the sampled parents.\n\n```python\nsamples = sampler.sample_all()\n```\n\nThe variable `samples` will contain a `dict` mapping table names to the `pandas.dataFrames`\ncontaining the sampled data.\n\n```\n{\n 'DEMO_CUSTOMERS':\n CUSTOMER_ID CUST_POSTAL_CODE PHONE_NUMBER1 CREDIT_LIMIT COUNTRY\n 0 5 63145 6286474239 1778 US\n 1 6 11371 4526647758 526 FRANCE\n 2 7 11371 6027109756 958 UK\n 3 8 63145 5712861733 1965 UK\n 4 9 11371 5728456040 1383 SPAIN,\n\n 'DEMO_ORDERS':\n ORDER_ID CUSTOMER_ID ORDER_TOTAL\n 0 11 5 1331\n 1 12 5 1952\n 2 13 5 2179\n 3 14 6 1160\n 4 15 6 1069\n 5 16 7 1090\n\n 'DEMO_ORDER_ITEMS':\n ORDER_ITEM_ID ORDER_ID PRODUCT_ID UNIT_PRICE QUANTITY\n 0 189 11 11 127 0\n 1 190 11 12 122 2\n 2 191 11 8 78 2\n 3 192 11 12 233 3\n 4 193 12 11 96 6\n 5 194 12 11 65 2\n}\n```\n\n## What's next?\n\nFor more details about **SDV** and all its possibilities and features, please check the\n[project documentation site](https://HDI-Project.github.io/SDV/)!\n\n\n# History\n\n## 0.1.2 - 2019-09-18\n\n### New Features\n\n* Add option to model the amount of child rows - Issue [93](https://github.com/HDI-Project/SDV/issues/93) by @ManuelAlvarezC\n\n### General Improvements\n\n* Add Evaluation Metrics - Issue [52](https://github.com/HDI-Project/SDV/issues/52) by @ManuelAlvarezC\n\n* Ensure unicity on primary keys on different calls - Issue [63](https://github.com/HDI-Project/SDV/issues/63) by @ManuelAlvarezC\n\n### Bugs fixed\n\n* executing readme: 'not supported between instances of 'int' and 'NoneType' - Issue [104](https://github.com/HDI-Project/SDV/issues/104) by @csala\n\n## 0.1.1 - Anonymization of data\n\n* Add warnings when trying to model an unsupported dataset structure. [GH#73](https://github.com/HDI-Project/SDV/issues/73)\n* Add option to anonymize data. [GH#51](https://github.com/HDI-Project/SDV/issues/51)\n* Add support for modeling data with different distributions, when using `GaussianMultivariate` model. [GH#68](https://github.com/HDI-Project/SDV/issues/68)\n* Add support for `VineCopulas` as a model. [GH#71](https://github.com/HDI-Project/SDV/issues/71)\n* Improve `GaussianMultivariate` parameter sampling, avoiding warnings and unvalid parameters. [GH#58](https://github.com/HDI-Project/SDV/issues/58)\n* Fix issue that caused that sampled categorical values sometimes got numerical values mixed. [GH#81](https://github.com/HDI-Project/SDV/issues/81)\n* Improve the validation of extensions. [GH#69](https://github.com/HDI-Project/SDV/issues/69)\n* Update examples. [GH#61](https://github.com/HDI-Project/SDV/issues/61)\n* Replaced `Table` class with a `NamedTuple`. [GH#92](https://github.com/HDI-Project/SDV/issues/92)\n* Fix inconsistent dependencies and add upper bound to dependencies. [GH#96](https://github.com/HDI-Project/SDV/issues/96)\n* Fix error when merging extension in `Modeler.CPA` when running examples. [GH#86](https://github.com/HDI-Project/SDV/issues/86)\n\n## 0.1.0 - First Release\n\n* First release on PyPI.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/HDI-Project/sdv", "keywords": "sdv", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "sdv", "package_url": "https://pypi.org/project/sdv/", "platform": "", "project_url": "https://pypi.org/project/sdv/", "project_urls": { "Homepage": "https://github.com/HDI-Project/sdv" }, "release_url": "https://pypi.org/project/sdv/0.1.2/", "requires_dist": [ "exrex (<0.11,>=0.9.4)", "numpy (<1.17,>=1.15.4)", "pandas (<0.25,>=0.23.4)", "copulas (<0.3,>=0.2.3)", "rdt (<0.2,>=0.1.2)", "docutils (<0.15,>=0.10)", "pytest (>=3.4.2) ; extra == 'dev'", "pytest-cov (>=2.6.0) ; extra == 'dev'", "bumpversion (>=0.5.3) ; extra == 'dev'", "pip (>=9.0.1) ; extra == 'dev'", "watchdog (>=0.8.3) ; extra == 'dev'", "m2r (>=0.2.0) ; extra == 'dev'", "Sphinx (>=1.7.1) ; extra == 'dev'", "sphinx-rtd-theme (>=0.2.4) ; extra == 'dev'", "flake8 (>=3.5.0) ; extra == 'dev'", "isort (>=4.3.4) ; extra == 'dev'", "autoflake (>=1.2) ; extra == 'dev'", "autopep8 (>=1.3.5) ; extra == 'dev'", "twine (>=1.10.0) ; extra == 'dev'", "wheel (>=0.30.0) ; extra == 'dev'", "tox (>=2.9.1) ; extra == 'dev'", "coverage (>=4.5.1) ; extra == 'dev'", "pytest (>=3.4.2) ; extra == 'test'", "pytest-cov (>=2.6.0) ; extra == 'test'" ], "requires_python": ">=3.5", "summary": "Automated generative modeling and sampling", "version": "0.1.2" }, "last_serial": 5849460, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "80c0d563c356106c3a8391c9715e8dce", "sha256": "9324427dc4f602ebeea30851be6dc7275d08dccb4d3aa85e6df0dfde9f0aac48" }, "downloads": -1, "filename": "sdv-0.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "80c0d563c356106c3a8391c9715e8dce", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 1137, "upload_time": "2018-06-28T12:48:34", "url": "https://files.pythonhosted.org/packages/19/7a/a5ded2eb7dddc1ff5f85e3a50815a7e5d73c6f26bef69aaf845b618c15fc/sdv-0.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d8054e19f0d6193d643a8a477d310574", "sha256": "3f2b9c16a5a57f897d98da5b91e393cd01d69d9391a2b9c4bad161529b96f229" }, "downloads": -1, "filename": "sdv-0.0.0.tar.gz", "has_sig": false, "md5_digest": "d8054e19f0d6193d643a8a477d310574", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 944, "upload_time": "2018-06-28T12:48:35", "url": "https://files.pythonhosted.org/packages/e0/f5/d83646fcd8dc1482cf2f493e34c1a5cb6fe7b898dc947bfef2339262bd76/sdv-0.0.0.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "74fe6e3fe415dbf2d51342996cc561e8", "sha256": "9e936a93ab2bcef7a675d6c9805a3402d3db6b081d4587155e0d241be68d226d" }, "downloads": -1, "filename": "sdv-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "74fe6e3fe415dbf2d51342996cc561e8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5", "size": 14339, "upload_time": "2018-09-27T18:23:23", "url": "https://files.pythonhosted.org/packages/47/78/48b12833fdd5c2ca69732fc6d59ee55035d3b5019bfd62187658db8d1777/sdv-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bdbd8be56808225155ef824074182169", "sha256": "827cfa2340509fbf316ece5476042f923241d3024762c95fc8d7874d8efdbe86" }, "downloads": -1, "filename": "sdv-0.1.0.tar.gz", "has_sig": false, "md5_digest": "bdbd8be56808225155ef824074182169", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 30421, "upload_time": "2018-09-27T18:23:25", "url": "https://files.pythonhosted.org/packages/79/6a/2462d3721291e87c8200824d62d71d66a7a99bdd13244db2d7e529f1c1aa/sdv-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "bc7b43309f37048018745bc91d645a5a", "sha256": "48491970c42003838bd79d4e9219d258102ec8e48076975ed8766d47a1460871" }, "downloads": -1, "filename": "sdv-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bc7b43309f37048018745bc91d645a5a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5", "size": 21166, "upload_time": "2019-04-02T16:25:30", "url": "https://files.pythonhosted.org/packages/f9/b8/18f7cff31bc9bf695c27f43449103c871d7e700227435a8c65d1e57afa56/sdv-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d5563373c67541682cc15b8fe676ea19", "sha256": "3ed63653ce7128b84e55d5f0f6971433ed2f497ee0e87a61cae703b221822eaa" }, "downloads": -1, "filename": "sdv-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d5563373c67541682cc15b8fe676ea19", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 46803, "upload_time": "2019-04-02T16:25:32", "url": "https://files.pythonhosted.org/packages/77/d0/074efa2583b6987265321e7ea2d52c5a53fdfc7c6d94509861a0e2d40389/sdv-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "b1008a861f8c85980464b46ad34a00c0", "sha256": "4ff685896194d9f1cbde210ef61b0d44fcd2e1a8507c5dd8d883159a84a7e615" }, "downloads": -1, "filename": "sdv-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b1008a861f8c85980464b46ad34a00c0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5", "size": 24356, "upload_time": "2019-09-18T11:25:45", "url": "https://files.pythonhosted.org/packages/d3/98/96de5600733ebb600f540e0172b402ae5a88b3aac7a93e0808e39919b729/sdv-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff90481bceed09b76a2761676175824e", "sha256": "6d9410d968fb5427a50819c59c62c4893806990de47a99fbf251900e466ba4d6" }, "downloads": -1, "filename": "sdv-0.1.2.tar.gz", "has_sig": false, "md5_digest": "ff90481bceed09b76a2761676175824e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 918681, "upload_time": "2019-09-18T11:25:48", "url": "https://files.pythonhosted.org/packages/a7/46/32592d679f5fa3cc74d5994f402998d592c5826e4b30d0596385d456b0d7/sdv-0.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b1008a861f8c85980464b46ad34a00c0", "sha256": "4ff685896194d9f1cbde210ef61b0d44fcd2e1a8507c5dd8d883159a84a7e615" }, "downloads": -1, "filename": "sdv-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b1008a861f8c85980464b46ad34a00c0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.5", "size": 24356, "upload_time": "2019-09-18T11:25:45", "url": "https://files.pythonhosted.org/packages/d3/98/96de5600733ebb600f540e0172b402ae5a88b3aac7a93e0808e39919b729/sdv-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff90481bceed09b76a2761676175824e", "sha256": "6d9410d968fb5427a50819c59c62c4893806990de47a99fbf251900e466ba4d6" }, "downloads": -1, "filename": "sdv-0.1.2.tar.gz", "has_sig": false, "md5_digest": "ff90481bceed09b76a2761676175824e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 918681, "upload_time": "2019-09-18T11:25:48", "url": "https://files.pythonhosted.org/packages/a7/46/32592d679f5fa3cc74d5994f402998d592c5826e4b30d0596385d456b0d7/sdv-0.1.2.tar.gz" } ] }