{ "info": { "author": "Adam Kelleher", "author_email": "akelleh@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2.7", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Scientific/Engineering :: Bio-Informatics", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Scientific/Engineering :: Mathematics" ], "description": "# Causality\n\nThis package contains tools for causal analysis using observational (rather than experimental) datasets. The main documentation is on the github page at github.com/akelleh/causality\n\n## Installation\n\nAssuming you have pip installed, just run\n```\npip install causality\n```\n\n## [Causal Analysis](https://github.com/akelleh/causality/tree/master/causality/analysis)\n\nThe simplest interface to this package is probably through the `CausalDataFrame` object in [`causality.analysis.CausalDataFrame`](https://github.com/akelleh/causality/blob/master/causality/analysis/dataframe.py#L8). This is just an extension of the `pandas.DataFrame` object, and so it inherits the same methods.\n\nThe `CausalDataFrame` current supports two kinds of causal analysis. First, it has a `CausalDataFrame.zmean` method. This method lets you control for a set of variables, `z`, when you're trying to estimate the effect of a discrete variable `x` on a continuous variable, `y`. It supports both returning the `y` estimates at each `x` value, as well as providing bootstrap error bars. For more details, check out the readme [here](https://github.com/akelleh/causality/tree/master/causality/analysis).\n\nThe second kind of analysis supported is plotting to show the effect of discrete or continuous `x` on continous `y` while controlling for `z`. You can do this with the `CausalDataFrame.zplot` method. For details, check out the readme [here](https://github.com/akelleh/causality/tree/master/causality/analysis).\n\n\n## Measuring Causal Effects\n\nthe [`causality.estimation`](https://github.com/akelleh/causality/tree/master/causality/estimation) module contains tools for estimating causal effects from observational and experimental data. Most tools are parametric, like `PropensityScoreMatching`, and can be found in `causality.estimation.parametric`. Other models are non-parametric, and rely on directly estimating densities and using the g-estimation approach.\n\n\n## DAG Inference\n\nThe `causality.inference` module will contain various algorithms for inferring causal DAGs. Currently (2016/01/23), the only algorithm implemented is the IC\\* algorithm from Pearl (2000). It has decent test coverage, but feel free to write some more! I've left some stubs in `tests/unit/test\\_IC.py`.\n\nTo run a graph search on a dataset, you can use the algorithms like (using IC\\* as an example):\n\n```python\nimport numpy\nimport pandas as pd\n\nfrom causality.inference.search import IC\nfrom causality.inference.independence_tests import RobustRegressionTest\n\n# generate some toy data:\nSIZE = 2000\nx1 = numpy.random.normal(size=SIZE)\nx2 = x1 + numpy.random.normal(size=SIZE)\nx3 = x1 + numpy.random.normal(size=SIZE)\nx4 = x2 + x3 + numpy.random.normal(size=SIZE)\nx5 = x4 + numpy.random.normal(size=SIZE)\n\n# load the data into a dataframe:\nX = pd.DataFrame({'x1' : x1, 'x2' : x2, 'x3' : x3, 'x4' : x4, 'x5' : x5})\n\n# define the variable types: 'c' is 'continuous'. The variables defined here\n# are the ones the search is performed over -- NOT all the variables defined\n# in the data frame.\nvariable_types = {'x1' : 'c', 'x2' : 'c', 'x3' : 'c', 'x4' : 'c', 'x5' : 'c'}\n\n# run the search\nic_algorithm = IC(RobustRegressionTest)\ngraph = ic_algorithm.search(X, variable_types)\n```\n\nNow, we have the inferred graph stored in `graph`. In this graph, each variable is a node (named from the DataFrame columns), and each edge represents statistical dependence between the nodes that can't be eliminated by conditioning on the variables specified for the search. If an edge can be oriented with the data available, the arrowhead is indicated in `'arrows'`. If the edge also satisfies the local criterion for genuine causation, then that directed edge will have `marked=True`. If we print the edges from the result of our search, we can see which edges are oriented, and which satisfy the local criterion for genuine causation:\n```python\n>>> graph.edges(data=True)\n[('x2', 'x1', {'arrows': [], 'marked': False}),\n ('x2', 'x4', {'arrows': ['x4'], 'marked': False}),\n ('x3', 'x1', {'arrows': [], 'marked': False}),\n ('x3', 'x4', {'arrows': ['x4'], 'marked': False}),\n ('x4', 'x5', {'arrows': ['x5'], 'marked': True})]\n```\n\nWe can see the edges from `'x2'` to `'x4'`, `'x3'` to `'x4'`, and `'x4'` to `'x5'` are all oriented toward the second of each pair. Additionally, we see that the edge from `'x4'` to `'x5'` satisfies the local criterion for genuine causation. This matches the structure given in figure `2.3(d)` in Pearl (2000).\n\n\n## Nonparametric Effects Estimation\n\nThe `causality.nonparametric` module contains a tool for non-parametrically estimating a causal distribution from an observational data set. You can supply an \"admissable set\" of variables for controlling, and the measure either the causal effect distribution of an effect given the cause, or the expected value of the effect given the cause.\n\nI've recently added adjustment for direct causes, where you can estimate the causal effect of fixing a set of X variables on a set of Y variables by adjusting for the parents of X in your graph. Using the dataset above, you can run this like\n```python\nfrom causality.estimation.adjustments import AdjustForDirectCauses\nfrom networkx import DiGraph\n\ng = DiGraph()\n\ng.add_nodes_from(['x1','x2','x3','x4', 'x5'])\ng.add_edges_from([('x1','x2'),('x1','x3'),('x2','x4'),('x3','x4')])\nadjustment = AdjustForDirectCauses()\n```\n\nThen, you can see the set of variables being adjusted for by\n```python\n>>> print adjustment.admissable_set(g, ['x2'], ['x3'])\nset(['x1'])\n```\nIf we hadn't adjusted for `'x1'` we would have incorrectly found that `'x2'` had a causal effect on `'x3'` due to the counfounding pathway `x2, x1, x3`. Adjustment for `'x1'` removes this bias.\n\nYou can see the causal effect of intervention, `P(x3|do(x2))` using the measured causal effect in `adjustment`,\n```python\n>>>from causality.estimation.nonparametric import CausalEffect\n>>>admissable_set = adjustment.admissable_set(g,['x2'], ['x3'])\n>>>effect = CausalEffect(X, ['x2'], ['x3'], variable_types=variable_types, admissable_set=list(admissable_set))\n>>>x = pd.DataFrame({'x2' : [0.], 'x3' : [0.]})\n>>>effect.pdf(x)\n0.268915603296\n```\n\nWhich is close to the correct value of `0.282` for a gaussian with mean 0. and variance 2. If you adjust the value of `'x2'`, you'll find that the probability of `'x3'` doesn't change. This is untrue with just the conditional distribution, `P(x3|x2)`, since in this case, observation and intervention are not equivalent.\n\n## Other Notes\n\nThis repository is in its early phases. The run-time for the tests is long. Many optimizations will be made in the near future, including\n* Implement fast mutual information calculation, O( N log N )\n* Speed up integrating out variables for controlling\n* Take a user-supplied graph, and find the set of admissable sets\n* Front-door criterion method for determining causal effects\n\nPearl, Judea. _Causality_. Cambridge University Press, (2000).\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/akelleh/causality", "keywords": "causality data analysis inference causal graphs DAG propensity score matching", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "causality", "package_url": "https://pypi.org/project/causality/", "platform": "", "project_url": "https://pypi.org/project/causality/", "project_urls": { "Homepage": "http://github.com/akelleh/causality" }, "release_url": "https://pypi.org/project/causality/0.0.9/", "requires_dist": [ "numpy", "scipy", "pandas", "statsmodels", "networkx", "patsy", "pytz", "python-dateutil", "decorator", "six" ], "requires_python": "", "summary": "Tools for causal inference", "version": "0.0.9" }, "last_serial": 4619134, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "3f687776d0265fd96ccd162ce6b72d58", "sha256": "c655651680e18ebb1863bdff5d68c6bb2370a605e12a68faeb93763626be4a74" }, "downloads": -1, "filename": "causality-0.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "3f687776d0265fd96ccd162ce6b72d58", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 14669, "upload_time": "2016-01-25T01:42:54", "url": "https://files.pythonhosted.org/packages/a1/08/3507e0e74c4397f94adc979efb8a01f5d0cd96a49efb91a0e3673a01b680/causality-0.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f69a88cd72f38dbf405cc160d71dcd1f", "sha256": "8b39d76f29b896492396832da00b5b9d9999ab233dc1b3fd8afb15e9a2ad0c35" }, "downloads": -1, "filename": "causality-0.0.1.tar.gz", "has_sig": false, "md5_digest": "f69a88cd72f38dbf405cc160d71dcd1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9348, "upload_time": "2016-01-25T01:42:46", "url": "https://files.pythonhosted.org/packages/a0/c6/cd3fd4af7c0e6b20cb0772e63980b30578bd5dc2ca2b4d1eda611ce32cd2/causality-0.0.1.tar.gz" } ], "0.0.1a1": [ { "comment_text": "", "digests": { "md5": "5f533633eec8bc29aec53f6d7e1207ab", "sha256": "51339ddd4ddc3924eaec68080d2d195c877c70840ec7516033a3f655cfa8bc46" }, "downloads": -1, "filename": "causality-0.0.1a1-py2-none-any.whl", "has_sig": false, "md5_digest": "5f533633eec8bc29aec53f6d7e1207ab", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 14703, "upload_time": "2016-01-25T01:28:19", "url": "https://files.pythonhosted.org/packages/11/42/f11dacffb396350d25973f53577c7752987146de4b32dde794b4a0d5e30a/causality-0.0.1a1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec75b5b81b2b2c65dca9a1eeaf3f17c9", "sha256": "f1b49f283b1da45f56a9ec7a3c26c6aaf5ebe620bc04534d4c67e1d8c45c577c" }, "downloads": -1, "filename": "causality-0.0.1a1.tar.gz", "has_sig": false, "md5_digest": "ec75b5b81b2b2c65dca9a1eeaf3f17c9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9355, "upload_time": "2016-01-25T01:28:14", "url": "https://files.pythonhosted.org/packages/b9/ed/8a322b238d639a5f6d851a392941df29f0bb7dac055c064ccae297d72495/causality-0.0.1a1.tar.gz" } ], "0.0.2": [ { "comment_text": "built for Darwin-13.3.0", "digests": { "md5": "7b32d50f457910e494550b522b6d7047", "sha256": "5708fdadd6ff4d8a58d03ae79000922e1e362545d9e984c1477a1f63adda454f" }, "downloads": -1, "filename": "causality-0.0.2.macosx-10.9-intel.tar.gz", "has_sig": false, "md5_digest": "7b32d50f457910e494550b522b6d7047", "packagetype": "bdist_dumb", "python_version": "any", "requires_python": null, "size": 18789, "upload_time": "2016-02-01T04:58:53", "url": "https://files.pythonhosted.org/packages/8f/fc/b702aae50d765b7134d671e5310689918696bb33d4dbd5edf978e2a9dea1/causality-0.0.2.macosx-10.9-intel.tar.gz" }, { "comment_text": "", "digests": { "md5": "76f63972d400b49ce34aeee0a7032ecd", "sha256": "e102892ca3cd801ebad39b037fb4a2e61aba87213185729004a75c6fbd36f6f4" }, "downloads": -1, "filename": "causality-0.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "76f63972d400b49ce34aeee0a7032ecd", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 14670, "upload_time": "2016-01-25T22:22:07", "url": "https://files.pythonhosted.org/packages/8c/2c/ca4a32ac1b6e3e862409cc6ffab29391319625e18a0a364196555c9a9771/causality-0.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c6ab71bb0291a4eebb07f3640a29016f", "sha256": "9d03751b582efaafc4ee4e4c787b7d295e36e5a9a1d7e0210114c96d1830f5da" }, "downloads": -1, "filename": "causality-0.0.2.tar.gz", "has_sig": false, "md5_digest": "c6ab71bb0291a4eebb07f3640a29016f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9668, "upload_time": "2016-01-25T22:21:11", "url": "https://files.pythonhosted.org/packages/1b/af/8fa2ea0142b7217b22df45aadec1c73acfa075a6ca3c07e492a31bdf3554/causality-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "built for Darwin-13.3.0", "digests": { "md5": "bf90d228722150f571d8de0c76e67316", "sha256": "26f0ba2785ec55694f82bff95d0b94cc4767ef65129888621fd389bdfd61693a" }, "downloads": -1, "filename": "causality-0.0.3.macosx-10.9-x86_64.tar.gz", "has_sig": false, "md5_digest": "bf90d228722150f571d8de0c76e67316", "packagetype": "bdist_dumb", "python_version": "any", "requires_python": null, "size": 18314, "upload_time": "2016-02-01T05:26:38", "url": "https://files.pythonhosted.org/packages/28/59/d0129243fe36e03663443d8162b4b0d38c7bcc547e036079a0fa53612700/causality-0.0.3.macosx-10.9-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "7d048e7ae490a09bf7db7212cfe1372f", "sha256": "37311c25bb0197afc1b2152c8231353d585c0c5402e733469d23aa9fb7d86994" }, "downloads": -1, "filename": "causality-0.0.3.tar.gz", "has_sig": false, "md5_digest": "7d048e7ae490a09bf7db7212cfe1372f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9773, "upload_time": "2016-02-01T05:26:49", "url": "https://files.pythonhosted.org/packages/57/c6/c25f9980bb1925710cbfe1f023a9c5ca4267676ed90ccbd9c7280e98266f/causality-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "3d787c01e183417fa82ab771acf7bfcd", "sha256": "a319c520a3a22e94bc6ba3ce8720050c6ebc3f95e554c76b2792cd0c4715f597" }, "downloads": -1, "filename": "causality-0.0.4.tar.gz", "has_sig": false, "md5_digest": "3d787c01e183417fa82ab771acf7bfcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19123, "upload_time": "2017-06-22T00:29:06", "url": "https://files.pythonhosted.org/packages/3d/1e/c3933a02a31fa04db4107da75c55180e6a6a1ce0a7b6822b52313bda8b99/causality-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "built for Linux-4.10.0-37-generic-x86_64-with-glibc2.9", "digests": { "md5": "9e041d141f71023c1beef5d91a40a473", "sha256": "a19dd3b10f087b3f0ab07525dafd6926f25beaca8297b5aa3e322215486691a7" }, "downloads": -1, "filename": "causality-0.0.5.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "9e041d141f71023c1beef5d91a40a473", "packagetype": "bdist_dumb", "python_version": "any", "requires_python": null, "size": 41743, "upload_time": "2017-11-04T16:43:53", "url": "https://files.pythonhosted.org/packages/7a/ed/a2b6de50de0f54710acf0616f6098d71c8e7f1ef33d871abb11633a3ceea/causality-0.0.5.linux-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "10d9eb0eda3f6b9c7a71e7f7ec182ec1", "sha256": "d9ce4cfd93a4cd68d67899d0341e0edd205344944d2d18dba4593a2cf2fe28a8" }, "downloads": -1, "filename": "causality-0.0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "10d9eb0eda3f6b9c7a71e7f7ec182ec1", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 26179, "upload_time": "2017-11-04T16:52:34", "url": "https://files.pythonhosted.org/packages/27/2d/2a283030b24de2c5a96f6756d260ee1d009fc7aa6f42e0aa607c490eb163/causality-0.0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ae25c73313de28467dd72a27c90339f8", "sha256": "88f50301013946d87ffef7c1ce8933d9e45902ed84acd7d10feba5cac61c47fe" }, "downloads": -1, "filename": "causality-0.0.5.tar.gz", "has_sig": false, "md5_digest": "ae25c73313de28467dd72a27c90339f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19064, "upload_time": "2017-11-04T16:48:34", "url": "https://files.pythonhosted.org/packages/0a/6a/85f6f05bf174425892aa43821ce7012b537f2cff4674f535f9ebe668f2d1/causality-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "built for Linux-4.13.0-26-generic-x86_64-with-glibc2.7", "digests": { "md5": "5d515ed3aed218732855f57c3e22d653", "sha256": "deed273eb9becf34f231387a5889d1bad4ac5e7c6d037507b98294390bee0578" }, "downloads": -1, "filename": "causality-0.0.6.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "5d515ed3aed218732855f57c3e22d653", "packagetype": "bdist_dumb", "python_version": "any", "requires_python": null, "size": 49371, "upload_time": "2018-01-15T22:34:14", "url": "https://files.pythonhosted.org/packages/70/bd/47bc46f3e3d5de69f8305a0050e1da65205ca10a6c4cd066a1788a138fdf/causality-0.0.6.linux-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "7bd7c2327877c6febfb70df681388848", "sha256": "a8df6c4e827e389c65f015483102efcf653d6eeefb7e6cf4bfda5f8ad90b8f1c" }, "downloads": -1, "filename": "causality-0.0.6.tar.gz", "has_sig": false, "md5_digest": "7bd7c2327877c6febfb70df681388848", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22105, "upload_time": "2018-01-15T22:34:13", "url": "https://files.pythonhosted.org/packages/8b/b7/b38a4969082bd47ea343cac0bf95bb64a2dc06ebd0036509f492fa8ff167/causality-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "9bcab7fc19939fe49891e1359cb2027f", "sha256": "5952d5e71dffc0f2715270ed79f661245549c8c37b0fed905e7ebf785df5a37c" }, "downloads": -1, "filename": "causality-0.0.7.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "9bcab7fc19939fe49891e1359cb2027f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44329, "upload_time": "2018-12-01T18:02:41", "url": "https://files.pythonhosted.org/packages/85/44/68cb012e9e3a36ac87c1fc8f0240248dac479727af6d2b86a2686f0bb584/causality-0.0.7.linux-x86_64.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "50e2a00c96202cb22046a62cd7b0618f", "sha256": "058d75712698e333b4bfdd540edea7c7dcef703dd0de8244df1a672a9f52d91d" }, "downloads": -1, "filename": "causality-0.0.8-py2-none-any.whl", "has_sig": false, "md5_digest": "50e2a00c96202cb22046a62cd7b0618f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 24232, "upload_time": "2018-12-01T18:34:17", "url": "https://files.pythonhosted.org/packages/ec/0b/211f18628f4c68acce3e6cf47788d4db0fc9aca21a4de0e3de91e703c671/causality-0.0.8-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "64c7e1a1731c8f5e585cffbbf59b5e96", "sha256": "e9469fa9fffd1915f19df81424e201cbfbff603f075e881bad5db6bed5d0185f" }, "downloads": -1, "filename": "causality-0.0.8.tar.gz", "has_sig": false, "md5_digest": "64c7e1a1731c8f5e585cffbbf59b5e96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20356, "upload_time": "2018-12-01T18:27:10", "url": "https://files.pythonhosted.org/packages/75/ca/bdf75d94d693911188847ddd0526fdcad63cee81cd47f378ab0f22178658/causality-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "7e91abb5e204f0383fc10886b698d2e6", "sha256": "326f63d7e4021c6435b8addfed0e2183cde683b7ac63ff5fd29eef1861ec84e1" }, "downloads": -1, "filename": "causality-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "7e91abb5e204f0383fc10886b698d2e6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24269, "upload_time": "2018-12-20T02:40:41", "url": "https://files.pythonhosted.org/packages/9b/31/5284b1f4a1f0ee00c6f8d9971ae7410d5567048245c3adb5486053e4bc8e/causality-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c760cb30ea7670b7576b854bfa314b72", "sha256": "2c042d7b2650f329f9d6fbbf39c627bc49d9478945100f99824aa8ab8aef5f6d" }, "downloads": -1, "filename": "causality-0.0.9.tar.gz", "has_sig": false, "md5_digest": "c760cb30ea7670b7576b854bfa314b72", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20399, "upload_time": "2018-12-20T02:42:47", "url": "https://files.pythonhosted.org/packages/c1/5c/58c246733deb73f5d88a5e2b13be8066fcbdc50837d83d29e52bd4f98e2b/causality-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7e91abb5e204f0383fc10886b698d2e6", "sha256": "326f63d7e4021c6435b8addfed0e2183cde683b7ac63ff5fd29eef1861ec84e1" }, "downloads": -1, "filename": "causality-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "7e91abb5e204f0383fc10886b698d2e6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24269, "upload_time": "2018-12-20T02:40:41", "url": "https://files.pythonhosted.org/packages/9b/31/5284b1f4a1f0ee00c6f8d9971ae7410d5567048245c3adb5486053e4bc8e/causality-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c760cb30ea7670b7576b854bfa314b72", "sha256": "2c042d7b2650f329f9d6fbbf39c627bc49d9478945100f99824aa8ab8aef5f6d" }, "downloads": -1, "filename": "causality-0.0.9.tar.gz", "has_sig": false, "md5_digest": "c760cb30ea7670b7576b854bfa314b72", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20399, "upload_time": "2018-12-20T02:42:47", "url": "https://files.pythonhosted.org/packages/c1/5c/58c246733deb73f5d88a5e2b13be8066fcbdc50837d83d29e52bd4f98e2b/causality-0.0.9.tar.gz" } ] }