{ "info": { "author": "Yue Zhao", "author_email": "zhaoy@cmu.edu", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Financial and Insurance Industry", "Intended Audience :: Information Technology", "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "combo: A Python Toolbox for Machine Learning Model Combination\n==============================================================\n\n\n**Deployment & Documentation & Stats**\n\n.. image:: https://img.shields.io/pypi/v/combo.svg?color=brightgreen\n :target: https://pypi.org/project/combo/\n :alt: PyPI version\n\n\n.. image:: https://readthedocs.org/projects/pycombo/badge/?version=latest\n :target: https://pycombo.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n\n.. image:: https://mybinder.org/badge_logo.svg\n :target: https://mybinder.org/v2/gh/yzhao062/combo/master\n :alt: Binder\n\n\n.. image:: https://img.shields.io/github/stars/yzhao062/combo.svg\n :target: https://github.com/yzhao062/combo/stargazers\n :alt: GitHub stars\n\n\n.. image:: https://img.shields.io/github/forks/yzhao062/combo.svg?color=blue\n :target: https://github.com/yzhao062/combo/network\n :alt: GitHub forks\n\n\n.. image:: https://pepy.tech/badge/combo\n :target: https://pepy.tech/project/combo\n :alt: Downloads\n\n\n.. image:: https://pepy.tech/badge/combo/month\n :target: https://pepy.tech/project/combo\n :alt: Downloads\n\n\n----\n\n\n**Build Status & Coverage & Maintainability & License**\n\n\n.. image:: https://travis-ci.org/yzhao062/combo.svg?branch=master\n :target: https://travis-ci.org/yzhao062/combo\n :alt: Build Status\n\n\n.. image:: https://circleci.com/gh/yzhao062/combo.svg?style=svg\n :target: https://circleci.com/gh/yzhao062/combo\n :alt: Circle CI\n\n\n.. image:: https://ci.appveyor.com/api/projects/status/te7uieha87305ike/branch/master?svg=true\n :target: https://ci.appveyor.com/project/yzhao062/combo/branch/master\n :alt: Build status\n\n\n.. image:: https://coveralls.io/repos/github/yzhao062/combo/badge.svg\n :target: https://coveralls.io/github/yzhao062/combo\n :alt: Coverage Status\n\n\n.. image:: https://api.codeclimate.com/v1/badges/465ebba81e990abb357b/maintainability\n :target: https://codeclimate.com/github/yzhao062/combo/maintainability\n :alt: Maintainability\n\n\n.. image:: https://img.shields.io/github/license/yzhao062/combo.svg\n :target: https://github.com/yzhao062/combo/blob/master/LICENSE\n :alt: License\n\n\n----\n\n\n**combo** is a comprehensive Python toolbox for **combining machine learning (ML) models and scores**.\n**Model combination** can be considered as a subtask of `ensemble learning `_,\nand has been widely used in real-world tasks and data science competitions like Kaggle [#Bell2007Lessons]_.\n\n**combo** library supports the combination of models and score from\nkey ML libraries such as `scikit-learn `_\nand `xgboost `_. See figure below for some representative\ncombination approaches.\n\n.. image:: https://raw.githubusercontent.com/yzhao062/combo/master/docs/figs/framework_demo.png\n :target: https://raw.githubusercontent.com/yzhao062/combo/master/docs/figs/framework_demo.png\n :alt: Combination Framework Demo\n\n\n**combo** is featured for:\n\n* **Unified APIs, detailed documentation, and interactive examples** across various algorithms.\n* **Advanced and latest models**, such as Stacking/DCS/DES/EAC/LSCP.\n* **Comprehensive coverage** for classification, clustering, anomaly detection, and raw score.\n* **Optimized performance with JIT and parallelization** when possible, using `numba `_ and `joblib `_.\n\n\n**API Demo**\\ :\n\n.. code-block:: python\n\n\n from combo.models.classifier_stacking import Stacking\n # initialize a group of base classifiers\n classifiers = [DecisionTreeClassifier(), LogisticRegression(),\n KNeighborsClassifier(), RandomForestClassifier(),\n GradientBoostingClassifier()]\n\n clf = Stacking(base_estimators=classifiers) # initialize a Stacking model\n clf.fit(X_train, y_train) # fit the model\n\n # predict on unseen data\n y_test_labels = clf.predict(X_test) # label prediction\n y_test_proba = clf.predict_proba(X_test) # probability prediction\n\n\n**Key Links and Resources**\\ :\n\n\n* `awesome-ensemble-learning `_ (ensemble learning related books, papers, and more)\n* `View the latest codes on Github `_\n* `View the documentation & API `_\n* `View all examples `_\n* `Execute Interactive Jupyter Notebooks `_\n\n\n**Table of Contents**\\ :\n\n\n* `Installation <#installation>`_\n* `API Cheatsheet & Reference <#api-cheatsheet--reference>`_\n* `Implemented Algorithms <#implemented-algorithms>`_\n* `Example 1: Classifier Combination with Stacking/DCS/DES <#example-of-stackingdcsdes>`_\n* `Example 2: Simple Classifier Combination <#example-of-classifier-combination>`_\n* `Example 3: Clustering Combination <#example-of-clustering-combination>`_\n* `Example 4: Outlier Detector Combination <#example-of-outlier-detector-combination>`_\n* `Development Status <#development-status>`_\n* `Inclusion Criteria <#inclusion-criteria>`_\n\n\n----\n\n\n\nInstallation\n^^^^^^^^^^^^\n\nIt is recommended to use **pip** for installation. Please make sure\n**the latest version** is installed, as combo is updated frequently:\n\n.. code-block:: bash\n\n pip install combo # normal install\n pip install --upgrade combo # or update if needed\n pip install --pre combo # or include pre-release version for new features\n\nAlternatively, you could clone and run setup.py file:\n\n.. code-block:: bash\n\n git clone https://github.com/yzhao062/combo.git\n cd combo\n pip install .\n\n\n**Required Dependencies**\\ :\n\n\n* Python 3.5, 3.6, or 3.7\n* joblib\n* matplotlib (**optional for running examples**)\n* numpy>=1.13\n* numba>=0.35\n* pyod\n* scipy>=0.19.1\n* scikit_learn>=0.19.1\n\n\n**Note on Python 2**\\ :\nThe maintenance of Python 2.7 will be stopped by January 1, 2020 (see `official announcement `_).\nTo be consistent with the Python change and combo's dependent libraries, e.g., scikit-learn,\n**combo only supports Python 3.5+** and we encourage you to use\nPython 3.5 or newer for the latest functions and bug fixes. More information can\nbe found at `Moving to require Python 3 `_.\n\n\n----\n\n\nAPI Cheatsheet & Reference\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFull API Reference: (https://pycombo.readthedocs.io/en/latest/api.html).\nThe following APIs are consistent for most of the models\n(API Cheatsheet: https://pycombo.readthedocs.io/en/latest/api_cc.html).\n\n* **fit(X, y)**\\ : Fit estimator. y is optional for unsupervised methods.\n* **predict(X)**\\ : Predict on a particular sample once the estimator is fitted.\n* **predict_proba(X)**\\ : Predict the probability of a sample belonging to each class once the estimator is fitted.\n* **fit_predict(X, y)**\\ : Fit estimator and predict on X. y is optional for unsupervised methods.\n\nFor raw score combination (after the score matrix is generated),\nuse individual methods from\n`\"score_comb.py\" `_ directly.\nRaw score combination API: (https://pycombo.readthedocs.io/en/latest/api.html#score-combination).\n\n\n----\n\n\nImplemented Algorithms\n^^^^^^^^^^^^^^^^^^^^^^\n\n**combo** groups combination frameworks by tasks. General purpose methods are\nfundamental ones which can be applied to various tasks.\n\n=================== ====================================================================================================== ===== ===========================================\nTask Algorithm Year Ref\n=================== ====================================================================================================== ===== ===========================================\nGeneral Purpose Average & Weighted Average: average across all scores/prediction results, maybe with weights N/A [#Zhou2012Ensemble]_\nGeneral Purpose Maximization: simple combination by taking the maximum scores N/A [#Zhou2012Ensemble]_\nGeneral Purpose Median: take the median value across all scores/prediction results N/A [#Zhou2012Ensemble]_\nGeneral Purpose Majority Vote & Weighted Majority Vote N/A [#Zhou2012Ensemble]_\nClassification SimpleClassifierAggregator: combining classifiers by general purpose methods above N/A N/A\nClassification DCS: Dynamic Classifier Selection (Combination of multiple classifiers using local accuracy estimates) 1997 [#Woods1997Combination]_\nClassification DES: Dynamic Ensemble Selection (From dynamic classifier selection to dynamic ensemble selection) 2008 [#Ko2008From]_\nClassification Stacking (meta ensembling): use a meta learner to learn the base classifier results N/A [#Gorman2016Kaggle]_\nClustering Clusterer Ensemble: combine the results of multiple clustering results by relabeling 2006 [#Zhou2006Clusterer]_\nClustering Combining multiple clusterings using evidence accumulation (EAC) 2002 [#Fred2005Combining]_\nAnomaly Detection SimpleDetectorCombination: combining outlier detectors by general purpose methods above N/A [#Aggarwal2017Outlier]_\nAnomaly Detection Average of Maximum (AOM): divide base detectors into subgroups to take the maximum, and then average 2015 [#Aggarwal2015Theoretical]_\nAnomaly Detection Maximum of Average (MOA): divide base detectors into subgroups to take the average, and then maximize 2015 [#Aggarwal2015Theoretical]_\nAnomaly Detection XGBOD: a semi-supervised combination framework for outlier detection 2018 [#Zhao2018XGBOD]_\nAnomaly Detection Locally Selective Combination (LSCP) 2019 [#Zhao2019LSCP]_\n=================== ====================================================================================================== ===== ===========================================\n\n\n**The comparison among selected implemented models** is made available below\n(\\ `Figure `_\\ ,\n`compare_selected_classifiers.py `_\\, `Interactive Jupyter Notebooks `_\\ ).\nFor Jupyter Notebooks, please navigate to **\"/notebooks/compare_selected_classifiers.ipynb\"**.\n\n\n.. image:: https://raw.githubusercontent.com/yzhao062/combo/master/examples/compare_selected_classifiers.png\n :target: https://raw.githubusercontent.com/yzhao062/combo/master/examples/compare_selected_classifiers.png\n :alt: Comparison of Selected Models\n\n\n----\n\n\n**All implemented modes** are associated with examples, check\n`\"combo examples\" `_\nfor more information.\n\n\nExample of Stacking/DCS/DES\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n`\"examples/classifier_stacking_example.py\" `_\ndemonstrates the basic API of stacking (meta ensembling). `\"examples/classifier_dcs_la_example.py\" `_\ndemonstrates the basic API of Dynamic Classifier Selection by Local Accuracy. `\"examples/classifier_des_la_example.py\" `_\ndemonstrates the basic API of Dynamic Ensemble Selection by Local Accuracy.\n\nIt is noted **the basic API is consistent across all these models**.\n\n\n#. Initialize a group of classifiers as base estimators\n\n .. code-block:: python\n\n\n # initialize a group of classifiers\n classifiers = [DecisionTreeClassifier(random_state=random_state),\n LogisticRegression(random_state=random_state),\n KNeighborsClassifier(),\n RandomForestClassifier(random_state=random_state),\n GradientBoostingClassifier(random_state=random_state)]\n\n\n#. Initialize, fit, predict, and evaluate with Stacking\n\n .. code-block:: python\n\n\n from combo.models.classifier_stacking import Stacking\n\n clf = Stacking(base_estimators=classifiers, n_folds=4, shuffle_data=False,\n keep_original=True, use_proba=False, random_state=random_state)\n\n clf.fit(X_train, y_train)\n y_test_predict = clf.predict(X_test)\n evaluate_print('Stacking | ', y_test, y_test_predict)\n\n\n#. See a sample output of classifier_stacking_example.py\n\n .. code-block:: bash\n\n\n Decision Tree | Accuracy:0.9386, ROC:0.9383, F1:0.9521\n Logistic Regression | Accuracy:0.9649, ROC:0.9615, F1:0.973\n K Neighbors | Accuracy:0.9561, ROC:0.9519, F1:0.9662\n Gradient Boosting | Accuracy:0.9605, ROC:0.9524, F1:0.9699\n Random Forest | Accuracy:0.9605, ROC:0.961, F1:0.9693\n\n Stacking | Accuracy:0.9868, ROC:0.9841, F1:0.9899\n\n\n----\n\n\nExample of Classifier Combination\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n`\"examples/classifier_comb_example.py\" `_\ndemonstrates the basic API of predicting with multiple classifiers. **It is noted that the API across all other algorithms are consistent/similar**.\n\n#. Initialize a group of classifiers as base estimators\n\n .. code-block:: python\n\n\n # initialize a group of classifiers\n classifiers = [DecisionTreeClassifier(random_state=random_state),\n LogisticRegression(random_state=random_state),\n KNeighborsClassifier(),\n RandomForestClassifier(random_state=random_state),\n GradientBoostingClassifier(random_state=random_state)]\n\n\n#. Initialize, fit, predict, and evaluate with a simple aggregator (average)\n\n .. code-block:: python\n\n\n from combo.models.classifier_comb import SimpleClassifierAggregator\n\n clf = SimpleClassifierAggregator(classifiers, method='average')\n clf.fit(X_train, y_train)\n y_test_predicted = clf.predict(X_test)\n evaluate_print('Combination by avg |', y_test, y_test_predicted)\n\n\n\n#. See a sample output of classifier_comb_example.py\n\n .. code-block:: bash\n\n\n Decision Tree | Accuracy:0.9386, ROC:0.9383, F1:0.9521\n Logistic Regression | Accuracy:0.9649, ROC:0.9615, F1:0.973\n K Neighbors | Accuracy:0.9561, ROC:0.9519, F1:0.9662\n Gradient Boosting | Accuracy:0.9605, ROC:0.9524, F1:0.9699\n Random Forest | Accuracy:0.9605, ROC:0.961, F1:0.9693\n\n Combination by avg | Accuracy:0.9693, ROC:0.9677, F1:0.9763\n Combination by w_avg | Accuracy:0.9781, ROC:0.9716, F1:0.9833\n Combination by max | Accuracy:0.9518, ROC:0.9312, F1:0.9642\n Combination by w_vote| Accuracy:0.9649, ROC:0.9644, F1:0.9728\n Combination by median| Accuracy:0.9693, ROC:0.9677, F1:0.9763\n\n\n----\n\n\nExample of Clustering Combination\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n`\"examples/cluster_comb_example.py\" `_\ndemonstrates the basic API of combining multiple base clustering estimators. `\"examples/cluster_eac_example.py\" `_\ndemonstrates the basic API of Combining multiple clusterings using evidence accumulation (EAC).\n\n#. Initialize a group of clustering methods as base estimators\n\n .. code-block:: python\n\n\n # Initialize a set of estimators\n estimators = [KMeans(n_clusters=n_clusters),\n MiniBatchKMeans(n_clusters=n_clusters),\n AgglomerativeClustering(n_clusters=n_clusters)]\n\n\n#. Initialize a Clusterer Ensemble class and fit the model\n\n .. code-block:: python\n\n\n from combo.models.cluster_comb import ClustererEnsemble\n # combine by Clusterer Ensemble\n clf = ClustererEnsemble(estimators, n_clusters=n_clusters)\n clf.fit(X)\n\n\n#. Get the aligned results\n\n .. code-block:: python\n\n\n # generate the labels on X\n aligned_labels = clf.aligned_labels_\n predicted_labels = clf.labels_\n\n\n\nExample of Outlier Detector Combination\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n`\"examples/detector_comb_example.py\" `_\ndemonstrates the basic API of combining multiple base outlier detectors.\n\n#. Initialize a group of outlier detection methods as base estimators\n\n .. code-block:: python\n\n\n # Initialize a set of estimators\n detectors = [KNN(), LOF(), OCSVM()]\n\n\n#. Initialize a simple averaging aggregator, fit the model, and make\n the prediction.\n\n .. code-block:: python\n\n\n from combo.models.detector combination import SimpleDetectorAggregator\n clf = SimpleDetectorAggregator(base_estimators=detectors)\n clf_name = 'Aggregation by Averaging'\n clf.fit(X_train)\n\n y_train_pred = clf.labels_ # binary labels (0: inliers, 1: outliers)\n y_train_scores = clf.decision_scores_ # raw outlier scores\n\n # get the prediction on the test data\n y_test_pred = clf.predict(X_test) # outlier labels (0 or 1)\n y_test_scores = clf.decision_function(X_test) # outlier scores\n\n\n#. Evaluate the prediction using ROC and Precision @ Rank n.\n\n .. code-block:: python\n\n # evaluate and print the results\n print(\"\\nOn Training Data:\")\n evaluate_print(clf_name, y_train, y_train_scores)\n print(\"\\nOn Test Data:\")\n evaluate_print(clf_name, y_test, y_test_scores)\n\n#. See sample outputs on both training and test data.\n\n .. code-block:: bash\n\n On Training Data:\n Aggregation by Averaging ROC:0.9994, precision @ rank n:0.95\n\n On Test Data:\n Aggregation by Averaging ROC:1.0, precision @ rank n:1.0\n\n\n----\n\n\nDevelopment Status\n^^^^^^^^^^^^^^^^^^\n\n**combo** is currently **under development** as of July 30, 2019. A concrete plan has\nbeen laid out and will be implemented in the next few months.\n\nSimilar to other libraries built by us, e.g., Python Outlier Detection Toolbox\n(`pyod `_),\n**combo** is also targeted to be published in *Journal of Machine Learning Research (JMLR)*,\n`open-source software track `_. A demo paper to\n*AAAI* or *IJCAI* may be submitted soon for progress update.\n\n**Watch & Star** to get the latest update! Also feel free to send me an email (zhaoy@cmu.edu)\nfor suggestions and ideas.\n\n\n----\n\n\nInclusion Criteria\n^^^^^^^^^^^^^^^^^^\n\nSimilarly to scikit-learn, We mainly consider well-established algorithms for inclusion.\nA rule of thumb is at least two years since publication, 50+ citations, and usefulness.\n\nHowever, we encourage the author(s) of newly proposed models to share and add your implementation into combo\nfor boosting ML accessibility and reproducibility.\nThis exception only applies if you could commit to the maintenance of your model for at least two year period.\n\n\n----\n\n\nReference\n^^^^^^^^^\n\n.. [#Aggarwal2015Theoretical] Aggarwal, C.C. and Sathe, S., 2015. Theoretical foundations and algorithms for outlier ensembles. *ACM SIGKDD Explorations Newsletter*, 17(1), pp.24-47.\n\n.. [#Aggarwal2017Outlier] Aggarwal, C.C. and Sathe, S., 2017. Outlier ensembles: An introduction. Springer.\n\n.. [#Bell2007Lessons] Bell, R.M. and Koren, Y., 2007. Lessons from the Netflix prize challenge. *SIGKDD Explorations*, 9(2), pp.75-79.\n\n.. [#Gorman2016Kaggle] Gorman, B. (2016). A Kaggler's Guide to Model Stacking in Practice. [online] The Official Blog of Kaggle.com. Available at: http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice [Accessed 26 Jul. 2019].\n\n.. [#Ko2008From] Ko, A.H., Sabourin, R. and Britto Jr, A.S., 2008. From dynamic classifier selection to dynamic ensemble selection. *Pattern recognition*, 41(5), pp.1718-1731.\n\n.. [#Fred2005Combining] Fred, A. L. N., & Jain, A. K. (2005). Combining multiple clusterings using evidence accumulation. *IEEE Transactions on Pattern Analysis and Machine Intelligence*, 27(6), 835\u2013850. https://doi.org/10.1109/TPAMI.2005.113\n\n.. [#Woods1997Combination] Woods, K., Kegelmeyer, W.P. and Bowyer, K., 1997. Combination of multiple classifiers using local accuracy estimates. *IEEE transactions on pattern analysis and machine intelligence*, 19(4), pp.405-410.\n\n.. [#Zhao2019LSCP] Zhao, Y., Nasrullah, Z., Hryniewicki, M.K. and Li, Z., 2019, May. LSCP: Locally selective combination in parallel outlier ensembles. In *Proceedings of the 2019 SIAM International Conference on Data Mining (SDM)*, pp. 585-593. Society for Industrial and Applied Mathematics.\n\n.. [#Zhao2018XGBOD] Zhao, Y. and Hryniewicki, M.K. XGBOD: Improving Supervised Outlier Detection with Unsupervised Representation Learning. *IEEE International Joint Conference on Neural Networks*, 2018.\n\n.. [#Zhou2006Clusterer] Zhou, Z.H. and Tang, W., 2006. Clusterer ensemble. *Knowledge-Based Systems*, 19(1), pp.77-83.\n\n.. [#Zhou2012Ensemble] Zhou, Z.H., 2012. Ensemble methods: foundations and algorithms. Chapman and Hall/CRC.", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "https://github.com/yzhao062/combo/archive/master.zip", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/yzhao062/combo", "keywords": "ensemble learning,model combination,outlier ensembles,data mining,machine learning,clustering,python", "license": "", "maintainer": "", "maintainer_email": "", "name": "combo", "package_url": "https://pypi.org/project/combo/", "platform": "", "project_url": "https://pypi.org/project/combo/", "project_urls": { "Download": "https://github.com/yzhao062/combo/archive/master.zip", "Homepage": "https://github.com/yzhao062/combo" }, "release_url": "https://pypi.org/project/combo/0.0.8/", "requires_dist": null, "requires_python": "", "summary": "A Python Toolbox for Machine Learning Model Combination", "version": "0.0.8" }, "last_serial": 5647618, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "e0b56c23313d704caf3d34ec6fe39307", "sha256": "e6b6757dbd119fb818b699450492a6f3efbc8437234d50a4ef4df38aa3c2bd7c" }, "downloads": -1, "filename": "combo-0.0.0.tar.gz", "has_sig": false, "md5_digest": "e0b56c23313d704caf3d34ec6fe39307", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2459, "upload_time": "2019-07-14T09:24:03", "url": "https://files.pythonhosted.org/packages/d7/ec/bc1857121703dec2614620f299dcaa67196555c78ca37756bbefc5dbb9ff/combo-0.0.0.tar.gz" } ], "0.0.1": [ { "comment_text": "", "digests": { "md5": "e4b5335be7359c3e74b391a3cb04b0cf", "sha256": "26999596c621ceb4b41adadde4eb60e9725d2756f7d245cd20fa229bcd8e14fb" }, "downloads": -1, "filename": "combo-0.0.1.tar.gz", "has_sig": false, "md5_digest": "e4b5335be7359c3e74b391a3cb04b0cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4674, "upload_time": "2019-07-15T15:22:57", "url": "https://files.pythonhosted.org/packages/dc/c5/90bc5e1c1ae5183722236b7a108bd9db35d8ff6ebbe3f17c5ff7234b0e48/combo-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "f27daef3308c7eda48963bd1dea70fcc", "sha256": "71104f113ef88661f63c1d790973eb5ac6d73a182849233229a7da26484cc2f6" }, "downloads": -1, "filename": "combo-0.0.2.tar.gz", "has_sig": false, "md5_digest": "f27daef3308c7eda48963bd1dea70fcc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18398, "upload_time": "2019-07-15T16:03:59", "url": "https://files.pythonhosted.org/packages/fb/f0/7b094afd01dadf19b0b32a4834c10ce4a57cec802ef953736131f8d161e9/combo-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "9d8bb3fd1101a2fdad2bd0a33d1402e1", "sha256": "7385b286d8aec0bca78997527eb6ffd3baa515475d20b5e8bb5321479621d420" }, "downloads": -1, "filename": "combo-0.0.3.tar.gz", "has_sig": false, "md5_digest": "9d8bb3fd1101a2fdad2bd0a33d1402e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20034, "upload_time": "2019-07-17T16:28:25", "url": "https://files.pythonhosted.org/packages/64/7c/f5502043dc482948ba7f1295b2dbefc6ebe74c1031d462da384df7945cb1/combo-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "07061e93760b7d6d9dc3af34c7abd31d", "sha256": "e93aec2059af29121b98e7cc57913432d21b69d033750b4b6c23c98da2780efa" }, "downloads": -1, "filename": "combo-0.0.4.tar.gz", "has_sig": false, "md5_digest": "07061e93760b7d6d9dc3af34c7abd31d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21568, "upload_time": "2019-07-21T03:04:19", "url": "https://files.pythonhosted.org/packages/ab/a1/da97b4fdf6f1e18c1b9d7fb1f30486fae06f24049bc1d5505e84e7e28fa5/combo-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "6fe1e83a6bb8cba0ecb010e1d19486e7", "sha256": "1299dc3f9a9068ebdb8a2aeaa4aadb5a088643ae275e8e4458bf24f3187fd14c" }, "downloads": -1, "filename": "combo-0.0.5.tar.gz", "has_sig": false, "md5_digest": "6fe1e83a6bb8cba0ecb010e1d19486e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25715, "upload_time": "2019-07-28T16:12:09", "url": "https://files.pythonhosted.org/packages/af/ba/c7065e7f0d295b2e59e3625611c55e809e975ee5da36f3ff37ea32777bb4/combo-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "de1db05b3738910bd753247c9c4e89ac", "sha256": "8df840734e1e5a96bf3780e967ca13ba4b0072b8185ef8d0eb03ce2cb261d457" }, "downloads": -1, "filename": "combo-0.0.6.tar.gz", "has_sig": false, "md5_digest": "de1db05b3738910bd753247c9c4e89ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31374, "upload_time": "2019-07-30T05:04:53", "url": "https://files.pythonhosted.org/packages/33/f6/d2ac7be51b4cfb94ab1bbc845a4a40a541eabbc1a01c4df08b8705754a65/combo-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "57e10d506aacb46149c89fcb502cf936", "sha256": "58b027544a4749ac837427a680298ed788417882a7245e20c762dca8cbaa0cd6" }, "downloads": -1, "filename": "combo-0.0.7.tar.gz", "has_sig": false, "md5_digest": "57e10d506aacb46149c89fcb502cf936", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34037, "upload_time": "2019-08-04T15:25:02", "url": "https://files.pythonhosted.org/packages/ac/b9/4c9995e7f4e2d0c376e10803940d981e32ec6b2b29097bc46c1e638be93e/combo-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "def7c9d222e0703c9014e2f68bb46fb7", "sha256": "321dcfd8fe37c15b515c8aaca8abfcbc38e28d718c89dfa5c7db963bcbe7da69" }, "downloads": -1, "filename": "combo-0.0.8.tar.gz", "has_sig": false, "md5_digest": "def7c9d222e0703c9014e2f68bb46fb7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35889, "upload_time": "2019-08-08T00:43:31", "url": "https://files.pythonhosted.org/packages/8e/4e/9ab16d4aa21da464903bd5630b28b36c65298fd74639308089b2d173d5a7/combo-0.0.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "def7c9d222e0703c9014e2f68bb46fb7", "sha256": "321dcfd8fe37c15b515c8aaca8abfcbc38e28d718c89dfa5c7db963bcbe7da69" }, "downloads": -1, "filename": "combo-0.0.8.tar.gz", "has_sig": false, "md5_digest": "def7c9d222e0703c9014e2f68bb46fb7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35889, "upload_time": "2019-08-08T00:43:31", "url": "https://files.pythonhosted.org/packages/8e/4e/9ab16d4aa21da464903bd5630b28b36c65298fd74639308089b2d173d5a7/combo-0.0.8.tar.gz" } ] }