{ "info": { "author": "", "author_email": "", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "[![Documentation Status](https://readthedocs.org/projects/n2d/badge/?version=latest)](https://n2d.readthedocs.io/en/latest/?badge=latest)\n\nWelcome to the stable master branch of N2D!! The active development branch is on [dev](https://github.com/josephsdavid/N2D/tree/dev), if you are contributing, please make branches from that!\n\n# Changes\n\n* Finally easily extensible (no more writing classes!)\n* [Model saving and loading!](https://n2d.readthedocs.io/en/latest/quickstart.html#saving-and-loading)\n[x] TF2 ready\n\n\n# Not Too Deep Clustering\n\nThis is a library implementation of [n2d](https://github.com/rymc/n2d). To learn more about N2D, and clustering manifolds of autoencoded embeddings, please refer to the [amazing paper](https://arxiv.org/abs/1908.05968) published August 2019.\n\n## What is it?\n\nNot too deep clustering is a state of the art \"deep\" clustering technique, in which first, the data is embedded using an autoencoder. Then, instead of clustering that using some deep clustering network, we use a manifold learner to find the underlying (local) manifold in the embedding. Then, we cluster that manifold. In the paper, this was shown to produce high quality clusters without the standard extreme feature engineering required for clustering.\n\nIn this repository, a framework for A) reproducing the study and B) extending the study is given, for further research and use in a variety of applications\n\n# Documentation\n\nFull documentation is available on [read the docs](https://n2d.readthedocs.io/en/latest/)\n\n# Installation\n\nN2D is [available on pypi](https://pypi.org/project/n2d/)\n\n```sh\npip install n2d\n```\n\n# Usage\n\nFirst, lets load in some data. In this example, we will use the Human Activity Recognition(HAR) dataset. In this dataset, sets of time series with data from mobile devices is used to classify what the person is doing (walking, sitting, etc.)\n\n```python\nimport n2d as nd\nimport n2d.datasets as data\n\nx,y, y_names = data.load_har()\n```\n\nNext, lets set up our deep learning environment, as well as load in necessary libraries:\n\n```python\nimport numpy as np\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nplt.style.use(['seaborn-white', 'seaborn-paper'])\nsns.set_context(\"paper\", font_scale=1.3)\nmatplotlib.use('agg')\n```\n\nFinally, we are ready to get clustering!\n\nThe first step of any not too deep clustering algorithm is to use an autoencoder to learn an embedding, so that is what we will do!\n\n```python\n\nn_clusters = 6\nae = n2d.AutoEncoder(x.shape[-1], n_clusters)\n```\n\nThe next step in this framework is to initialize a manifold clustering algorithm, in general UmapGMM, which builds an autoencoder network and gets everything ready for clustering:\n\n```python\nmanifold_clusterer = n2d.UmapGMM(n_clusters)\n```\n\nFinally, we pass both of these into the N2D class:\n\n```python\nharcluster = n2d.n2d(ae, manifold_clusterer)\n```\n\nNext, we fit the data. In this step, the autoencoder is trained on the data, setting up weights.\n\n```python\nharcluster.fit(x, weight_id = \"har.h5\")\n```\n\nThe next time we want to use this autoencoder, we will instead use the weights argument:\n\n```python\nharcluster.fit(x, weights = \"har.h5\")\n```\n\nNow we can make a prediction, as well as visualize and assess. In this step, the manifold learner learns the manifold for the data, which is then clustered. By default, it makes the prediction on the data stored internally, however you can specify a new `x` in order to make predictions on new data.\n\n```python\npreds = harcluster.predict(x)\n# predictions are stored in harcluster.preds\nharcluster.visualize(y, y_names, n_clusters = n_clusters)\nprint(harcluster.assess(y))\n# (0.81212, 0.71669, 0.64013)\n```\n\nBefore viewing the results, lets talk about the metrics. The first metric is cluster accuracy, which we see here is 81.2%, which is absolutely state of the art for the HAR dataset. The next metric is NMI, which is another metric which describes cluster quality based on labels, independent of the number of clusters. We have an NMI of 0.717, which is again absolutely state of the art for this dataset. The last metric, ARI, shows another comparison between the actual groupings and our grouping. A value of 1 means the groupings are nearly the same, while a value of 0 means they completely disagree. We have a value of 0.64013, which indicates that are predictions are more or less in agreement with the truth, however they are not perfect.\n\n![N2D prediction](https://i.imgur.com/91iwVVj.png)\n\nN2D prediction\n\n![](https://i.imgur.com/8PTPTmE.png)\nActual clusters\n\n## Extending\n\nThis library comes with 2 special generator classes, which make it much easier to extend the library. For more in depth discussion, please see [the documentation](https://n2d.readthedocs.io/en/latest/)\n\n### Replacing the manifold clustering mechanism\n\nLets assume we want to use hdbscan to cluster our manifold, instead of gaussian mixing. In this case, we use the `manifold_cluster_generator` class. Below is a short example using hdbscan\n\n\n```python\nimport n2d\nimport numpy as np\nimport n2d.datasets as data\nimport hdbscan\nimport umap\n\n\n# load up mnist example\nx,y = data.load_mnist()\n\n# autoencoder can be just passed normally, see the other examples for extending\n# it\nae = n2d.AutoEncoder(input_dim=x.shape[-1], latent_dim=40)\n\n# arguments for clusterer go in a dict\nhdbscan_args = {\"min_samples\":10,\"min_cluster_size\":500, 'prediction_data':True}\n\n# arguments for manifold learner go in a dict\numap_args = {\"metric\":\"euclidean\", \"n_components\":2, \"n_neighbors\":30,\"min_dist\":0}\n\n# pass the classes and dicts into the generator\n# manifold class, manifold args, cluster class, cluster args\ndb = n2d.manifold_cluster_generator(umap.UMAP, umap_args, hdbscan.HDBSCAN, hdbscan_args)\n\n# pass the manifold-cluster tool and the autoencoder into the n2d class\ndb_clust = n2d.n2d(ae, db)\n\n# fit\ndb_clust.fit(x, epochs = 10)\n\n# the clusterer is a normal hdbscan object\nprint(db_clust.clusterer.probabilities_)\n\nprint(db_clust.clusterer.labels_)\n\n# access the manifold learner at\nprint(db_clust.manifolder)\n\n\n# if the parent classes have a method you can likely use it (make an issue if not)\ndb_clust.fit_predict(x, epochs = 10)\n\n# however this will error because hdbscan doesnt have that method\ndb_clust.predict(x)\n\n# predict on new data with the approximate prediction\nx_test, y_test = data.load_mnist_test()\n\n# access the parts of the autoencoder within n2d or outside of it\ntest_embedding = db_clust.encoder.predict(x_test)\n\ntest_embedding - test_n2d_embedding\n# all zeros\n\ntest_labels, strengths = hdbscan.approximate_predict(db_clust.clusterer, db_clust.manifolder.transform(test_embedding))\n\nprint(test_labels)\n\nprint(strengths)\n```\n\n### Replacing the embedding mechanism\n\nWe can also pretty easily replace the autoencoder with a new one using the `autoencoder_generator` class:\n\n```python\nimport n2d\nfrom n2d import datasets as data\nfrom tensorflow.keras.layers import Dense, Input\nfrom tensorflow.keras.models import Model\nimport seaborn as sns\nimport umap\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib\nplt.style.use(['seaborn-white', 'seaborn-paper'])\nsns.set_context(\"paper\", font_scale=1.3)\n\n# load up data\nx,y, y_names = data.load_fashion()\n\n# define number of clusters\nn_clusters = 10\n\n# set up manifold learner\numapgmm = n2d.UmapGMM(n_clusters)\n\n# set up parameters for denoising autoencoder\ndef add_noise(x, noise_factor):\n x_clean = x\n x_noisy = x_clean + noise_factor * np.random.normal(loc = 0.0, scale = 1.0, size = x_clean.shape)\n x_noisy = np.clip(x_noisy, 0., 1.)\n return x_noisy\n\n# define stages of networks\nhidden_dims = [500, 500, 2000]\ninput_dim = x.shape[-1]\ninputs = Input(input_dim)\nencoded = inputs\nfor d in hidden_dims:\n encoded = Dense(d, activation = \"relu\")(encoded)\nencoded = Dense(n_clusters)(encoded)\ndecoded = encoded\nfor d in hidden_dims[::-1]:\n decoded = Dense(d, activation = \"relu\")(decoded)\noutputs = Dense(input_dim)(decoded)\n\n# inputs: iterable of inputs, center, outputs of ae, lambda for noise (x_lambda is not a necessary argument)\ndenoising_ae = n2d.autoencoder_generator((inputs, encoded, outputs), x_lambda = lambda x: add_noise(x, 0.5))\n\n# define model\nmodel = n2d.n2d(denousing_ae, umapgmm)\n\n# fit the model\nmodel.fit(x, epochs=10)\n\n# make some predictions\nmodel.predict(x)\n\nmodel.visualize(y, y_names, n_clusters = n_clusters)\nplt.show()\nprint(model.assess(y))\n```\n\n# Roadmap\n\n- [x] Package library\n- [x] Package data\n- [x] Early stopping\n- [ ] Implement data augmentation techniques for images, sequences, and time series\n- [x] Make autoencoder interchangeable just like the rest\n- [x] Simpler way to extract embedding\n- [ ] Implement other types of autoencoders as well as convolutional layers\n- [x] Manage file saving paths better\n- [ ] Implement other promising methods\n- [ ] Make assessment/visualization more extensible\n- [x] Documentation?\n- [x] Find an elegant way to deal with pre training weights\n- [ ] Package on Nix\n- [ ] Blog post?\n- [ ] Clean up code examples!\n\n# Contributing\n\nN2D is a work in progress and is open to suggestions to make it faster, more extensible, and generally more usable. Please make an issue if you have any ideas of how to be more accessible and more usable! \n\n\n# Citation\n\nIf you use N2D in your research, please credit the original authors of the paper. Bibtex included below:\n\n```\n@article{2019arXiv190805968M,\n title = {N2D:(Not Too) Deep Clustering via Clustering the Local Manifold of an Autoencoded Embedding},\n author = {{McConville}, Ryan and {Santos-Rodriguez}, Raul and {Piechocki}, Robert J and {Craddock}, Ian},\n journal = {arXiv preprint arXiv:1908.05968},\n year = \"2019\",\n}\n```\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/josephsdavid/N2D-OOP", "keywords": "", "license": "MIT", "maintainer": "david Josephs", "maintainer_email": "josephsd@smu.edu", "name": "n2d", "package_url": "https://pypi.org/project/n2d/", "platform": "", "project_url": "https://pypi.org/project/n2d/", "project_urls": { "Homepage": "https://github.com/josephsdavid/N2D-OOP" }, "release_url": "https://pypi.org/project/n2d/0.3.2/", "requires_dist": [ "numpy", "scikit-learn", "umap-learn", "tensorflow", "scipy", "h5py (>=2.0.0)", "matplotlib", "seaborn", "pandas" ], "requires_python": "", "summary": "(Not too) deep clustering", "version": "0.3.2", "yanked": false, "yanked_reason": null }, "last_serial": 6467150, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "531b7edba14769f217e7e03440ee2be9", "sha256": "e3d7a4679a2babc4c927540375146d11d20df99d2f20567f1f6dcf11c8d24fe3" }, "downloads": -1, "filename": "n2d-0.0.1.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "531b7edba14769f217e7e03440ee2be9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3978, "upload_time": "2019-10-29T22:27:37", "upload_time_iso_8601": "2019-10-29T22:27:37.281571Z", "url": "https://files.pythonhosted.org/packages/ff/96/acc28b1cfbe22a8b24632485b5d1e89dd95b62de523a74c617cc256eaf65/n2d-0.0.1.linux-x86_64.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "7affbe281255f2a7a9b71a160c100e65", "sha256": "dc5b36bd89a3cc47937642667e6bcbad7e8af027661eebea60bb1f826ecacdbe" }, "downloads": -1, "filename": "n2d-0.0.2.tar.gz", "has_sig": false, "md5_digest": "7affbe281255f2a7a9b71a160c100e65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7310, "upload_time": "2019-10-30T03:30:21", "upload_time_iso_8601": "2019-10-30T03:30:21.924720Z", "url": "https://files.pythonhosted.org/packages/3d/18/ddeff3764755a5d2bae471e6a0041b99e6e3fdd655d2c971191b38562248/n2d-0.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "b70712c00538b4b619a0b5d62c8b1c79", "sha256": "3715efa5bdc59cdbe76293d1e793998a32080f10a379a60808d84d8c0b60dc91" }, "downloads": -1, "filename": "n2d-0.0.3.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "b70712c00538b4b619a0b5d62c8b1c79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9450, "upload_time": "2019-10-30T14:03:54", "upload_time_iso_8601": "2019-10-30T14:03:54.046781Z", "url": "https://files.pythonhosted.org/packages/49/f7/7810024e91ca08a9422ec59dfc954b9976081e0366758f7b136c91adbd0b/n2d-0.0.3.linux-x86_64.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "e6e34bab12f8e86efd66a64226556b19", "sha256": "8e5efa00820452676043f8ddeef93930ec251c4849cea049255c9980a466e2b4" }, "downloads": -1, "filename": "n2d-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "e6e34bab12f8e86efd66a64226556b19", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6484, "upload_time": "2019-10-30T14:18:37", "upload_time_iso_8601": "2019-10-30T14:18:37.475361Z", "url": "https://files.pythonhosted.org/packages/89/fb/6e63b00fbb0662d3a4daf4b45595fed02f0d2fd6d948e589f48674b00057/n2d-0.0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4ba00205c2e48dd2f623a045ccf78692", "sha256": "5def4afe4a33e2b57cb57f5342a45a346ffc90e080e81ac9f963adcfab5cdfee" }, "downloads": -1, "filename": "n2d-0.0.4.tar.gz", "has_sig": false, "md5_digest": "4ba00205c2e48dd2f623a045ccf78692", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7614, "upload_time": "2019-10-30T14:18:39", "upload_time_iso_8601": "2019-10-30T14:18:39.088115Z", "url": "https://files.pythonhosted.org/packages/ee/fe/68bf0841d3394e1c3cbf113a25382ca6dcfa96af0a52b076de1216919538/n2d-0.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "ade170df6b3f1be09b8f7982d78ed9f8", "sha256": "b07ec85c5d88c6c4c3ecdea8a6b79dafe5cf2f429c63547895bba84f5610e446" }, "downloads": -1, "filename": "n2d-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "ade170df6b3f1be09b8f7982d78ed9f8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7513, "upload_time": "2019-10-31T20:47:05", "upload_time_iso_8601": "2019-10-31T20:47:05.207253Z", "url": "https://files.pythonhosted.org/packages/51/ed/9d9d244c5494ae8afa169bbd6049f81c74c5be37c3ce2d9216a4bd619443/n2d-0.0.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "69115f4dd7df269b719470fef4b6d5d2", "sha256": "82d229a4cd2a313b11d46f8ff66b7ec4d6aa7f66d19396b5b5dd0b5903334c7f" }, "downloads": -1, "filename": "n2d-0.0.5.tar.gz", "has_sig": false, "md5_digest": "69115f4dd7df269b719470fef4b6d5d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9190, "upload_time": "2019-10-31T20:47:06", "upload_time_iso_8601": "2019-10-31T20:47:06.952906Z", "url": "https://files.pythonhosted.org/packages/3c/0a/281f726a543b52c5101b110d0dd49c3cfc6f1ef3548359b43e4144c66705/n2d-0.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "5370500f7f460f94e70064a57afa37a9", "sha256": "9bdfdc141043af94a83888cbe3db549cf085c5d093f87423701365314e57f382" }, "downloads": -1, "filename": "n2d-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "5370500f7f460f94e70064a57afa37a9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9096, "upload_time": "2019-11-07T09:23:08", "upload_time_iso_8601": "2019-11-07T09:23:08.713117Z", "url": "https://files.pythonhosted.org/packages/e1/9b/26df6ecf6d61b25a8190f8f6eb5e374faf92e63b4bf167fbaaac0e9e21f2/n2d-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b4634dfca73e1b7d12a6dd3e5c283724", "sha256": "97bec8ffd5b0d5f7e4aad0aea8c74ba0a25f32658e7a1612c5b360f1c519562a" }, "downloads": -1, "filename": "n2d-0.1.2.tar.gz", "has_sig": false, "md5_digest": "b4634dfca73e1b7d12a6dd3e5c283724", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 223866, "upload_time": "2019-11-07T09:23:10", "upload_time_iso_8601": "2019-11-07T09:23:10.548689Z", "url": "https://files.pythonhosted.org/packages/58/ed/8e36c4f505ecca83ee56680234a638ca24358cf086cad44b6d215d27884c/n2d-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "d760670ae7cdeff80cef7f628c5f45d1", "sha256": "cba93230f4bc641af31a6fe09c0ce25e410e11b29e470768dc8b7105e5db750a" }, "downloads": -1, "filename": "n2d-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "d760670ae7cdeff80cef7f628c5f45d1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12241, "upload_time": "2019-11-17T00:35:42", "upload_time_iso_8601": "2019-11-17T00:35:42.535448Z", "url": "https://files.pythonhosted.org/packages/4e/9b/19ed84f827f91f84f920d9c6aa153159897388bbab00f13b07d88fbb518e/n2d-0.1.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "bb079a209b280450abb3852ba876a53b", "sha256": "38944112a8bf685613a460a775c837c8d5f427905b4afc90d06022f42615e847" }, "downloads": -1, "filename": "n2d-0.1.5.tar.gz", "has_sig": false, "md5_digest": "bb079a209b280450abb3852ba876a53b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28426, "upload_time": "2019-11-17T00:35:44", "upload_time_iso_8601": "2019-11-17T00:35:44.384281Z", "url": "https://files.pythonhosted.org/packages/a5/26/ba5c1338869dbc7bbdebab6aedf5a140c0760702c918e13f015610726927/n2d-0.1.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "f9b74812e26f16d1fdb57a2c1b0c31e5", "sha256": "7298051f56aa595964b9ac1732f7a3190231a8e872380522a6ab6d60bcb3590c" }, "downloads": -1, "filename": "n2d-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "f9b74812e26f16d1fdb57a2c1b0c31e5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12243, "upload_time": "2019-11-17T08:41:42", "upload_time_iso_8601": "2019-11-17T08:41:42.686786Z", "url": "https://files.pythonhosted.org/packages/4a/22/92f5a04df6041b61507b53cab3447124fc017bc2b8e5a3d7fd25ee08d683/n2d-0.1.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9f010d5e83de196349f4d8bc01f0c97a", "sha256": "667aad9d44304d9a6cae2a25064d3a4698732e9a01e3d26cd88d6d0c78f87331" }, "downloads": -1, "filename": "n2d-0.1.6.tar.gz", "has_sig": false, "md5_digest": "9f010d5e83de196349f4d8bc01f0c97a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30246, "upload_time": "2019-11-17T08:41:44", "upload_time_iso_8601": "2019-11-17T08:41:44.730304Z", "url": "https://files.pythonhosted.org/packages/87/89/7d6524d80d66bfe38f920592f147017ce73ccfd18aeae132a8d4753b460d/n2d-0.1.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "074c892260fa6e4ad155dc390cf49fc0", "sha256": "cfc16df08ee7a935784062b295221e6ae8acca0583062ba522f549083b6bc5c2" }, "downloads": -1, "filename": "n2d-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "074c892260fa6e4ad155dc390cf49fc0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13628, "upload_time": "2019-11-18T21:44:01", "upload_time_iso_8601": "2019-11-18T21:44:01.237623Z", "url": "https://files.pythonhosted.org/packages/94/4a/bafd241dba53423163eb96d5ab77bf36da32d513f0f1d21e3c00d97cfc9d/n2d-0.1.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "21b4c31da24442229a0d75689f063c8a", "sha256": "b9362eed7af0bba7e9fa050c09df0a9f950807f48f822550cf77acfc1ccef93b" }, "downloads": -1, "filename": "n2d-0.1.7.tar.gz", "has_sig": false, "md5_digest": "21b4c31da24442229a0d75689f063c8a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30390, "upload_time": "2019-11-18T21:44:03", "upload_time_iso_8601": "2019-11-18T21:44:03.083316Z", "url": "https://files.pythonhosted.org/packages/ad/61/bb79b1dd9a31494b951abf63753d64c4eb0688c20dba5e66e774cc284867/n2d-0.1.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "a0bc7ad7a5da52379dc0c2cfacf47ce3", "sha256": "e866360b56ad2786cc0d0fbfdb36f318cd2d28a58f4d7d1235938e2eab6a45c1" }, "downloads": -1, "filename": "n2d-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "a0bc7ad7a5da52379dc0c2cfacf47ce3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13963, "upload_time": "2019-11-22T08:13:19", "upload_time_iso_8601": "2019-11-22T08:13:19.273871Z", "url": "https://files.pythonhosted.org/packages/95/92/2759d66676a19de7f84d781f772743e10b6c16df31dbe8fd2c30941a693c/n2d-0.1.9-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "07ee38867fca6219db8b76e415210671", "sha256": "c365c042185b7df97d7e60c5582b68b6548b35c9e9013ae945c677d4909d0ede" }, "downloads": -1, "filename": "n2d-0.1.9.tar.gz", "has_sig": false, "md5_digest": "07ee38867fca6219db8b76e415210671", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32124, "upload_time": "2019-11-22T08:13:21", "upload_time_iso_8601": "2019-11-22T08:13:21.007350Z", "url": "https://files.pythonhosted.org/packages/a4/2e/0bebcd5901f925eaa6c5ba5326c33bbcc96137c021a45c4f01b7ca977336/n2d-0.1.9.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "7fe5ad3785599dba74a960a0ae4548a4", "sha256": "10b78df89aa5ec76c57d5989d6828a91a1ade1575c77fc1f3120981389df6ad7" }, "downloads": -1, "filename": "n2d-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7fe5ad3785599dba74a960a0ae4548a4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13814, "upload_time": "2019-12-18T17:36:25", "upload_time_iso_8601": "2019-12-18T17:36:25.408159Z", "url": "https://files.pythonhosted.org/packages/d6/20/bae2404254c5f579b0aa96f5239858fa0ca4936faf498a81a777d3a1920c/n2d-0.2.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e0fdf199ea382a24f9c6e306f9685d62", "sha256": "041e0d5e23672aa0c06a839e17163e7dcb4a24f227a491b81ce8f740c8bd11a2" }, "downloads": -1, "filename": "n2d-0.2.2.tar.gz", "has_sig": false, "md5_digest": "e0fdf199ea382a24f9c6e306f9685d62", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28318, "upload_time": "2019-12-18T17:36:27", "upload_time_iso_8601": "2019-12-18T17:36:27.186697Z", "url": "https://files.pythonhosted.org/packages/27/4f/ae9c2fa886d731b07d9cf48b9bce8b9622838235ff3c8ef8c225de82f69d/n2d-0.2.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "3a7e842a5aea5a2faecff1bfdda81649", "sha256": "d609e5d6b4163d8ed55c26490ace5fddaa7d64a3ed79441cb2d5ddf50e3fba06" }, "downloads": -1, "filename": "n2d-0.2.5-py3-none-any.whl", "has_sig": false, "md5_digest": "3a7e842a5aea5a2faecff1bfdda81649", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14394, "upload_time": "2020-01-15T19:25:31", "upload_time_iso_8601": "2020-01-15T19:25:31.912321Z", "url": "https://files.pythonhosted.org/packages/19/7a/7a99f02a6580902bb1fb80dce474ea7db8b80287da610fdf8641d298c9c2/n2d-0.2.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "66c82c8c339cd83cca5acc770bfdf952", "sha256": "824a22c2f940e962e2ada6b9baad2e9223754973823c4aa9abf25ffa13e898c9" }, "downloads": -1, "filename": "n2d-0.2.5.tar.gz", "has_sig": false, "md5_digest": "66c82c8c339cd83cca5acc770bfdf952", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31785, "upload_time": "2020-01-15T19:25:35", "upload_time_iso_8601": "2020-01-15T19:25:35.128995Z", "url": "https://files.pythonhosted.org/packages/d4/1a/8a0227a62f5858cebb2ffcdcdf9bb2df0fa275822cf7473ccf0cf561debb/n2d-0.2.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "cc94796914ee0f3116ac90cfa9b29ffd", "sha256": "b81098ed562a1c2fa4c7741ce4bea4cf7febeb992a44d56d1630966135fcd281" }, "downloads": -1, "filename": "n2d-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "cc94796914ee0f3116ac90cfa9b29ffd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14245, "upload_time": "2020-01-16T10:34:27", "upload_time_iso_8601": "2020-01-16T10:34:27.176685Z", "url": "https://files.pythonhosted.org/packages/3e/30/408acb72ddb9d8648e83a61b565cadc4aa7404ffc88ce16356fef538ee2b/n2d-0.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "12f4d5939a8e038c97407777b957220b", "sha256": "f713eeac5ab33c78994fba9faac4aed6acec79e73ab46ae4a01de6a6b556ed5f" }, "downloads": -1, "filename": "n2d-0.3.1.tar.gz", "has_sig": false, "md5_digest": "12f4d5939a8e038c97407777b957220b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30653, "upload_time": "2020-01-16T10:34:29", "upload_time_iso_8601": "2020-01-16T10:34:29.186783Z", "url": "https://files.pythonhosted.org/packages/43/d3/5825359e183d2fdcf88f4a1718e7c3ee622903113e1b7863e0262ca2da70/n2d-0.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "adc96a4d1550fecaff4c1139639e5f73", "sha256": "a0cfe6eb5723a6404d1bc25f7fec09632e8b93d11e34150b78ef93a6a0dca842" }, "downloads": -1, "filename": "n2d-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "adc96a4d1550fecaff4c1139639e5f73", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14232, "upload_time": "2020-01-16T17:14:03", "upload_time_iso_8601": "2020-01-16T17:14:03.080660Z", "url": "https://files.pythonhosted.org/packages/24/bc/548e0d998c03b5ff8283d18a6f77191edb1e1d720b8a25780d64cdd666a5/n2d-0.3.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "86ce2dfae24e151240ce0833167332d1", "sha256": "e4be4fd198b06937b6b2ed6d7179fa81aaf8d634dec5c0f0bf046c539598609f" }, "downloads": -1, "filename": "n2d-0.3.2.tar.gz", "has_sig": false, "md5_digest": "86ce2dfae24e151240ce0833167332d1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30724, "upload_time": "2020-01-16T17:14:05", "upload_time_iso_8601": "2020-01-16T17:14:05.096984Z", "url": "https://files.pythonhosted.org/packages/48/29/fdafd1aad6aac9467f26bb45346c4f2fd08d0d45cef2e448341a316d7d5f/n2d-0.3.2.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "adc96a4d1550fecaff4c1139639e5f73", "sha256": "a0cfe6eb5723a6404d1bc25f7fec09632e8b93d11e34150b78ef93a6a0dca842" }, "downloads": -1, "filename": "n2d-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "adc96a4d1550fecaff4c1139639e5f73", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14232, "upload_time": "2020-01-16T17:14:03", "upload_time_iso_8601": "2020-01-16T17:14:03.080660Z", "url": "https://files.pythonhosted.org/packages/24/bc/548e0d998c03b5ff8283d18a6f77191edb1e1d720b8a25780d64cdd666a5/n2d-0.3.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "86ce2dfae24e151240ce0833167332d1", "sha256": "e4be4fd198b06937b6b2ed6d7179fa81aaf8d634dec5c0f0bf046c539598609f" }, "downloads": -1, "filename": "n2d-0.3.2.tar.gz", "has_sig": false, "md5_digest": "86ce2dfae24e151240ce0833167332d1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30724, "upload_time": "2020-01-16T17:14:05", "upload_time_iso_8601": "2020-01-16T17:14:05.096984Z", "url": "https://files.pythonhosted.org/packages/48/29/fdafd1aad6aac9467f26bb45346c4f2fd08d0d45cef2e448341a316d7d5f/n2d-0.3.2.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }