diff --git a/README.md b/README.md index 81a0c24..c1522aa 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,32 @@ Final Project for CAPP122 ### Team -Jackie Glasheen: jglasheen +Jackie Glasheen, Harsh Vardhan Pachisia, Shwetha Srinivasan, and Jennifer Yeaton -Harsh Vardhan Pachisia: harshpachisia +### Description -Shwetha Srinivasan: shwetha +**42.63 %** of natural disasters in the United States since 1980 have taken place over the last 12 years. It is evident that climate change and global warming are causing extreme weather disasters to occur with more frequency. The increase in natural disaster declarations over the past several decades has led to the federal government spending more money on disaster relief. Due to the increase in frequency and cost of such disasters, a Congressional Research Service [paper](https://sgp.fas.org/crs/homesec/R45484.pdf) from January 2022 suggests that Congress may consider limiting federal disaster relief spending. -Jennifer Yeaton: jkyeaton +Disasters impact different geographic regions, affecting specific states and communities disproportionately. Through this dashboard, we hope to shed light on the increase in disaster frequency and cost nationwide. We highlight the specific situation in each state, where its political stance is on climate, and showcase the top ten counties that are at most risk based on socio-economic factors and require long term policy action. -### Description -- Why this problem matters. What did we do about it? -- Major insights. -- How can this be helpful? +This dashboard was built using Python and Dash, using [climate disaster](https://www.fema.gov/openfema-data-page/disaster-declarations-summaries-v2) and [public assistance](https://www.fema.gov/openfema-data-page/public-assistance-funded-project-summaries-v1) data from the Federal Emergency Management Agency, scraped data of the voting patterns on the Climate IRA bill, and the [Census API](https://www.census.gov/data/developers/data-sets.html) for county-level socio-economic breakdown. ### Runing the project -- Add steps that the person needes to follow to run the entire project. -### Example Insights (Add charts and screenshots of graphics). -- \ No newline at end of file +This project can be run using Poetry. The steps are outlined below. + +1. Make a clone of the project repository + +2. Go to the project directory: `cd 30122-project-snow-lm` + +3. From the directory install virtual environment and dependencies: `poetry install` + +4. Activate the virtual environment: `poetry shell` + +5. Create an environment variable for the U.S. Census API key: `export CENSUS_API_KEY=YOUR_KEY_HERE` + +6. Run the project: `python3 -m snowlm` + +It will ask you to open the dash application in the browser to see the interactive dashboard. + +Pressing Control+C in your terminal will close the application. \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 56a9c79..ee9f87a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,94 @@ # This file is automatically @generated by Poetry and should not be changed by hand. +[[package]] +name = "astroid" +version = "2.15.0" +description = "An abstract syntax tree for Python with inference support." +category = "main" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.0-py3-none-any.whl", hash = "sha256:e3e4d0ffc2d15d954065579689c36aac57a339a4679a679579af6401db4d3fdb"}, + {file = "astroid-2.15.0.tar.gz", hash = "sha256:525f126d5dc1b8b0b6ee398b33159105615d92dc4a17f2cd064125d57f6186fa"}, +] + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] + +[[package]] +name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] + +[[package]] +name = "black" +version = "23.1.0" +description = "The uncompromising code formatter." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, + {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, + {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, + {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, + {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, + {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, + {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, + {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, + {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, + {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, + {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, + {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, + {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, + {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "certifi" version = "2022.12.7" @@ -110,6 +199,285 @@ files = [ {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, ] +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "click-plugins" +version = "1.1.1" +description = "An extension module for click to enable registering CLI commands via setuptools entry-points." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, + {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] + +[[package]] +name = "cligj" +version = "0.7.2" +description = "Click params for commmand line interfaces to GeoJSON" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" +files = [ + {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, + {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +test = ["pytest-cov"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cssselect" +version = "1.2.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] + +[[package]] +name = "dash" +version = "2.8.1" +description = "A Python framework for building reactive web-apps. Developed by Plotly." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "dash-2.8.1-py3-none-any.whl", hash = "sha256:3a9eea30f83733df1b7631fc5248eb87445e7458394558d784c91d072b7f41aa"}, + {file = "dash-2.8.1.tar.gz", hash = "sha256:a71dd81d167fa5e0ad41f356a221357d92724ae84f9faedb6f7ffa1fddfd4969"}, +] + +[package.dependencies] +dash-core-components = "2.0.0" +dash-html-components = "2.0.0" +dash-table = "5.0.0" +Flask = ">=1.0.4" +plotly = ">=5.0.0" + +[package.extras] +celery = ["celery[redis] (>=5.1.2)", "importlib-metadata (<5)", "redis (>=3.5.3)"] +ci = ["black (==21.6b0)", "black (==22.3.0)", "dash-dangerously-set-inner-html", "dash-flow-example (==0.0.5)", "flake8 (==3.9.2)", "flaky (==3.7.0)", "flask-talisman (==1.0.0)", "isort (==4.3.21)", "mimesis", "mock (==4.0.3)", "numpy", "openpyxl", "orjson (==3.5.4)", "orjson (==3.6.7)", "pandas (==1.1.5)", "pandas (>=1.4.0)", "preconditions", "pyarrow", "pyarrow (<3)", "pylint (==2.13.5)", "pytest-mock", "pytest-rerunfailures", "pytest-sugar (==0.9.6)", "xlrd (<2)", "xlrd (>=2.0.1)"] +compress = ["flask-compress"] +dev = ["PyYAML (>=5.4.1)", "coloredlogs (>=15.0.1)", "fire (>=0.4.0)"] +diskcache = ["diskcache (>=5.2.1)", "multiprocess (>=0.70.12)", "psutil (>=5.8.0)"] +testing = ["beautifulsoup4 (>=4.8.2)", "cryptography (<3.4)", "lxml (>=4.6.2)", "multiprocess (>=0.70.12)", "percy (>=2.0.2)", "psutil (>=5.8.0)", "pytest (>=6.0.2)", "requests[security] (>=2.21.0)", "selenium (>=3.141.0,<=4.2.0)", "waitress (>=1.4.4)"] + +[[package]] +name = "dash-bootstrap-components" +version = "1.4.0" +description = "Bootstrap themed components for use in Plotly Dash" +category = "main" +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "dash-bootstrap-components-1.4.0.tar.gz", hash = "sha256:1844774299a6773035a4b0c1e4ffeab525bee30b8a7df4029d422fad12c1d159"}, + {file = "dash_bootstrap_components-1.4.0-py3-none-any.whl", hash = "sha256:5a82ca0105ac57be1e8fae2c7e729227a7ccbf9dfacf6a1b1d9114d38e65b334"}, +] + +[package.dependencies] +dash = ">=2.0.0" + +[package.extras] +pandas = ["numpy", "pandas"] + +[[package]] +name = "dash-bootstrap-templates" +version = "1.0.8" +description = "A collection of Plotly figure templates with a Bootstrap theme" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dash-bootstrap-templates-1.0.8.tar.gz", hash = "sha256:cdd7971b2af7bf5ed2f73c771eed97505a42246d7b00299f380de5ed372402b3"}, + {file = "dash_bootstrap_templates-1.0.8-py3-none-any.whl", hash = "sha256:92a39bc5693a7ba224b34bc08e27ce94622e1d1eea239ce0dc6ba50579bc7c32"}, +] + +[package.dependencies] +dash = "*" +dash-bootstrap-components = ">=1.0.0" +importlib-resources = {version = ">=5.1.0", markers = "python_version < \"3.9\""} +numpy = "*" + +[package.extras] +dev = ["spectra", "tinycss2"] + +[[package]] +name = "dash-core-components" +version = "2.0.0" +description = "Core component suite for Dash" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dash_core_components-2.0.0-py3-none-any.whl", hash = "sha256:52b8e8cce13b18d0802ee3acbc5e888cb1248a04968f962d63d070400af2e346"}, + {file = "dash_core_components-2.0.0.tar.gz", hash = "sha256:c6733874af975e552f95a1398a16c2ee7df14ce43fa60bb3718a3c6e0b63ffee"}, +] + +[[package]] +name = "dash-html-components" +version = "2.0.0" +description = "Vanilla HTML components for Dash" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dash_html_components-2.0.0-py3-none-any.whl", hash = "sha256:b42cc903713c9706af03b3f2548bda4be7307a7cf89b7d6eae3da872717d1b63"}, + {file = "dash_html_components-2.0.0.tar.gz", hash = "sha256:8703a601080f02619a6390998e0b3da4a5daabe97a1fd7a9cebc09d015f26e50"}, +] + +[[package]] +name = "dash-table" +version = "5.0.0" +description = "Dash table" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dash_table-5.0.0-py3-none-any.whl", hash = "sha256:19036fa352bb1c11baf38068ec62d172f0515f73ca3276c79dee49b95ddc16c9"}, + {file = "dash_table-5.0.0.tar.gz", hash = "sha256:18624d693d4c8ef2ddec99a6f167593437a7ea0bf153aa20f318c170c5bc7308"}, +] + +[[package]] +name = "dill" +version = "0.3.6" +description = "serialize all of python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "fiona" +version = "1.9.1" +description = "Fiona reads and writes spatial data files" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Fiona-1.9.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:902b67b2d012c5797b5d7d3cb3b46dcf9a342cf90a7f7e53fb12c83738d19926"}, + {file = "Fiona-1.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2f4535ae2c8446e6b328745a44567478d5a077ed63c888b8c212dddb1e11925"}, + {file = "Fiona-1.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3d7f3286fb59b93cefefb89014b6fa8413126e180e15c576db859ba936cf334"}, + {file = "Fiona-1.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:692fe64c0f3a39742d6f7a8e420a8387f6aec3b6818b727d2dfc98a0c40e992d"}, + {file = "Fiona-1.9.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:a017a39650df0cc541c57cf7de450bb4cee6fd9760eb716323b594c1074634a2"}, + {file = "Fiona-1.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c3b52d49bc379fdcfd1250b38e7e00ab24ee14eb765376c793bbe251ffd09d6a"}, + {file = "Fiona-1.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbb0ae851cd4417104c469335a01f938251a8639317f93d422c5c808150bd27"}, + {file = "Fiona-1.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:4a6d8fcbbdafa8af8ac1904628b0267382ed9f9921933d061d7bfc5d3f3daf99"}, + {file = "Fiona-1.9.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:74f056a84dc52a0b21a2cf024601a69105596f06f28d40b45049948be17b4df2"}, + {file = "Fiona-1.9.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5b9f3f6c782bb4ae2c924eefd373cabdeaaa99f86477b9c7c71eb20c052ee7c5"}, + {file = "Fiona-1.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5d6183189a7e05e2498d38a1df3ab07e1353fa48e977cbc3a31203927bd06bca"}, + {file = "Fiona-1.9.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5f2c14beec98a330aee1fd81fa0447a6aa1d5e0a75d000c0052dbe1f23dd6cfd"}, + {file = "Fiona-1.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:585a47ec21f2d198abc112158eaf12a6587a272beb7f001162d8c3b262676666"}, + {file = "Fiona-1.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4368b4054f21518a19dea54ce9ac445c40418c6331c0c99d1531c3ddff05da"}, + {file = "Fiona-1.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:839ed0db23198bb754f0d655d4eeaf5f9c141bef734557e77e95e4dc83e42e7f"}, + {file = "Fiona-1.9.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:decca3956032ae2d2c19d2f7fa8a4553c43a6e66eb5abe9a05f6ddadcb1bfe5c"}, + {file = "Fiona-1.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb827fa0030d03d8080723137c74b865ec18dbade87c02ed60215491a315c6be"}, + {file = "Fiona-1.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7e0f36484757baa8cd1c0602941e029ff992282776f9afae4c5b90f501ff005"}, + {file = "Fiona-1.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:f98933b552adf0506799097934a6950de412288e7a50466144d04874d6f63fbc"}, + {file = "Fiona-1.9.1.tar.gz", hash = "sha256:3a3725e94840a387fef48726d60db6a6791563f366939d22378a4661f8941be7"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +certifi = "*" +click = ">=8.0,<9.0" +click-plugins = ">=1.0" +cligj = ">=0.5" +munch = ">=2.3.2" +setuptools = "*" + +[package.extras] +all = ["Fiona[calc,s3,test]"] +calc = ["shapely"] +s3 = ["boto3 (>=1.3.1)"] +test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] + +[[package]] +name = "flask" +version = "2.2.3" +description = "A simple framework for building complex web applications." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Flask-2.2.3-py3-none-any.whl", hash = "sha256:c0bec9477df1cb867e5a67c9e1ab758de9cb4a3e52dd70681f59fa40a62b3f2d"}, + {file = "Flask-2.2.3.tar.gz", hash = "sha256:7eb373984bf1c770023fce9db164ed0c3353cd0b53f130f4693da0ca756a2e6d"}, +] + +[package.dependencies] +click = ">=8.0" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.0" +Jinja2 = ">=3.0" +Werkzeug = ">=2.2.2" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "geopandas" +version = "0.12.2" +description = "Geographic pandas extensions" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "geopandas-0.12.2-py3-none-any.whl", hash = "sha256:0a470e4bf6f5367e6fd83ab6b40405e0b805c8174665bbcb7c4077ed90202912"}, + {file = "geopandas-0.12.2.tar.gz", hash = "sha256:0acdacddefa176525e4da6d9aeeece225da26055c4becdc6e97cf40fa97c27f4"}, +] + +[package.dependencies] +fiona = ">=1.8" +packaging = "*" +pandas = ">=1.0.0" +pyproj = ">=2.6.1.post1" +shapely = ">=1.7" + [[package]] name = "idna" version = "3.4" @@ -122,6 +490,139 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "importlib-metadata" +version = "6.0.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"}, + {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "importlib-resources" +version = "5.12.0" +description = "Read resources from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +category = "main" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] + [[package]] name = "lxml" version = "4.9.2" @@ -215,6 +716,109 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=0.29.7)"] +[[package]] +name = "markupsafe" +version = "2.1.2" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "munch" +version = "2.5.0" +description = "A dot-accessible dictionary (a la JavaScript objects)" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"}, + {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +testing = ["astroid (>=1.5.3,<1.6.0)", "astroid (>=2.0)", "coverage", "pylint (>=1.7.2,<1.8.0)", "pylint (>=2.3.1,<2.4.0)", "pytest"] +yaml = ["PyYAML (>=5.1.0)"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + [[package]] name = "numpy" version = "1.24.2" @@ -314,6 +918,18 @@ pytz = ">=2020.1" [package.extras] test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +[[package]] +name = "pathspec" +version = "0.11.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, + {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, +] + [[package]] name = "patsy" version = "0.5.3" @@ -333,6 +949,22 @@ six = "*" [package.extras] test = ["pytest", "pytest-cov", "scipy"] +[[package]] +name = "platformdirs" +version = "3.1.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.1.0-py3-none-any.whl", hash = "sha256:13b08a53ed71021350c9e300d4ea8668438fb0046ab3937ac9a29913a1a1350a"}, + {file = "platformdirs-3.1.0.tar.gz", hash = "sha256:accc3665857288317f32c7bebb5a8e482ba717b474f3fc1d18ca7f9214be0cef"}, +] + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + [[package]] name = "plotly" version = "5.13.1" @@ -368,6 +1000,108 @@ plotly = ">=4.1.0" scipy = ">=0.18" statsmodels = ">=0.9.0" +[[package]] +name = "plotly-geo" +version = "1.0.0" +description = "geo shape files for use with plotly.py" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "plotly-geo-1.0.0.tar.gz", hash = "sha256:422359c859fc1bccfd5baaffd82d23f4ea06686c1822e72f76270c9d7f82d70e"}, + {file = "plotly_geo-1.0.0-py3-none-any.whl", hash = "sha256:9f695ca0a48494c821d8ab612d33b092bc64ec8de86d021c5209cc0b217aa9ce"}, +] + +[[package]] +name = "pylint" +version = "2.16.4" +description = "python code static checker" +category = "main" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "pylint-2.16.4-py3-none-any.whl", hash = "sha256:4a770bb74fde0550fa0ab4248a2ad04e7887462f9f425baa0cd8d3c1d098eaee"}, + {file = "pylint-2.16.4.tar.gz", hash = "sha256:8841f26a0dbc3503631b6a20ee368b3f5e0e5461a1d95cf15d103dab748a0db3"}, +] + +[package.dependencies] +astroid = ">=2.14.2,<=2.16.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pyproj" +version = "3.4.1" +description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyproj-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e463c687007861a9949909211986850cfc2e72930deda0d06449ef2e315db534"}, + {file = "pyproj-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f87f16b902c8b2af007295c63a435f043db9e40bd45e6f96962c7b8cd08fdb5"}, + {file = "pyproj-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60d112d8f1621a606b7f2adb0b1582f80498e663413d2ba9f5df1c93d99f432"}, + {file = "pyproj-3.4.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f38dea459e22e86326b1c7d47718a3e10c7a27910cf5eb86ea2679b8084d0c4e"}, + {file = "pyproj-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a53acbde511a7a9e1873c7f93c68f35b8c3653467b77195fe18e847555dcb7a"}, + {file = "pyproj-3.4.1-cp310-cp310-win32.whl", hash = "sha256:0c7b32382ae22a9bf5b690d24c7b4c0fb89ba313c3a91ef1a8c54b50baf10954"}, + {file = "pyproj-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:6bdac3bc1899fcc4021be06d303b342923fb8311fe06f8d862c348a1a0e78b41"}, + {file = "pyproj-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cd9f9c409f465834988ce0aa8c1ed496081c6957f2e5ef40ed28de04397d3c0b"}, + {file = "pyproj-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0406f64ff59eb3342efb102c9f31536430aa5cde5ef0bfabd5aaccb73dd8cd5a"}, + {file = "pyproj-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a98fe3e53be428e67ae6a9ee9affff92346622e0e3ea0cbc15dce939b318d395"}, + {file = "pyproj-3.4.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0189fdd7aa789542a7a623010dfff066c5849b24397f81f860ec3ee085cbf55c"}, + {file = "pyproj-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f3f75b030cf811f040c90a8758a20115e8746063e4cad0d0e941a4954d1219b"}, + {file = "pyproj-3.4.1-cp311-cp311-win32.whl", hash = "sha256:ef8c30c62fe4e386e523e14e1e83bd460f745bd2c8dfd0d0c327f9460c4d3c0c"}, + {file = "pyproj-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d1e7f42da205e0534831ae9aa9cee0353ab8c1aab2c369474adbb060294d98a"}, + {file = "pyproj-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a5eada965e8ac24e783f2493d1d9bcd11c5c93959bd43558224dd31d9faebd1c"}, + {file = "pyproj-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:19f5de1a7c3b81b676d846350d4bdf2ae6af13b9a450d1881706f088ecad0e2c"}, + {file = "pyproj-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57ec7d2b7f2773d877927abc72e2229ef8530c09181be0e28217742bae1bc4f5"}, + {file = "pyproj-3.4.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a30d78e619dae5cd1bb69addae2f1e5f8ee1b4a8ab4f3d954e9eaf41948db506"}, + {file = "pyproj-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a32e1d12340ad93232b7ea4dc1a4f4b21fa9fa9efa4b293adad45be7af6b51ec"}, + {file = "pyproj-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ce50126dad7cd4749ab86fc4c8b54ec0898149ce6710ab5c93c76a54a4afa249"}, + {file = "pyproj-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:129234afa179c8293b010ea4f73655ff7b20b5afdf7fac170f223bcf0ed6defd"}, + {file = "pyproj-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:231c038c6b65395c41ae3362320f03ce8054cb54dc63556e605695e5d461a27e"}, + {file = "pyproj-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9d82df555cf19001bac40e1de0e40fb762dec785685b77edd6993286c01b7f7"}, + {file = "pyproj-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c0d1ac9ef5a4d2e6501a4b30136c55f1e1db049d1626cc313855c4f97d196d"}, + {file = "pyproj-3.4.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97065fe82e80f7e2740e7897a0e36e8defc0a3614927f0276b4f1d1ea1ef66fa"}, + {file = "pyproj-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bd633f3b8ca6eb09135dfaf06f09e2869deb139985aab26d728e8a60c9938b9"}, + {file = "pyproj-3.4.1-cp39-cp39-win32.whl", hash = "sha256:da96319b137cfd66f0bae0e300cdc77dd17af4785b9360a9bdddb1d7176a0bbb"}, + {file = "pyproj-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:7aef19d5a0a3b2d6b17f7dc9a87af722e71139cd1eea7eb82ed062a8a4b0e272"}, + {file = "pyproj-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8078c90cea07d53e3406c7c84cbf76a2ac0ffc580c365f13801575486b9d558c"}, + {file = "pyproj-3.4.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:321b82210dc5271558573d0874b9967c5a25872a28d0168049ddabe8bfecffce"}, + {file = "pyproj-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a5425cd2a0b16f5f944d49165196eebaa60b898a08c404a644c29e6a7a04b3"}, + {file = "pyproj-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d70ca5933cddbe6f51396006fb9fc78bc2b1f9d28775922453c4b04625a7efb"}, + {file = "pyproj-3.4.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c240fe6bcb5c325b50fc967d5458d708412633f4f05fefc7fb14c14254ebf421"}, + {file = "pyproj-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef76abfee1a0676ef973470abe11e22998750f2bd944afaf76d44ad70b538c06"}, + {file = "pyproj-3.4.1.tar.gz", hash = "sha256:261eb29b1d55b1eb7f336127344d9b31284d950a9446d1e0d1c2411f7dd8e3ac"}, +] + +[package.dependencies] +certifi = "*" + +[[package]] +name = "pyshp" +version = "2.3.1" +description = "Pure Python read/write support for ESRI Shapefile format" +category = "main" +optional = false +python-versions = ">=2.7" +files = [ + {file = "pyshp-2.3.1-py2.py3-none-any.whl", hash = "sha256:67024c0ccdc352ba5db777c4e968483782dfa78f8e200672a90d2d30fd8b7b49"}, + {file = "pyshp-2.3.1.tar.gz", hash = "sha256:4caec82fd8dd096feba8217858068bacb2a3b5950f43c048c6dc32a3489d5af1"}, +] + [[package]] name = "python-dateutil" version = "2.8.2" @@ -417,38 +1151,6 @@ urllib3 = ">=1.21.1,<1.27" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "scipy" -version = "1.6.1" -description = "SciPy: Scientific Library for Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"}, - {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"}, - {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"}, - {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"}, - {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"}, - {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"}, - {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"}, - {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"}, - {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"}, - {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"}, - {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"}, - {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"}, - {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"}, - {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"}, - {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"}, - {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"}, - {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"}, - {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"}, - {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"}, -] - -[package.dependencies] -numpy = ">=1.16.5" - [[package]] name = "scipy" version = "1.9.3" @@ -488,6 +1190,78 @@ dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "setuptools" +version = "67.5.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.5.0-py3-none-any.whl", hash = "sha256:9f0004c0daa3d41ef4465934a89498da3eef994039f48845d6eb8202aa13b2e9"}, + {file = "setuptools-67.5.0.tar.gz", hash = "sha256:113ff8d482b826d2f3b99f26adb1fe505e526a94a08e68cdf392d1dff9ce0595"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shapely" +version = "2.0.1" +description = "Manipulation and analysis of geometric objects" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shapely-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b06d031bc64149e340448fea25eee01360a58936c89985cf584134171e05863f"}, + {file = "shapely-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9a6ac34c16f4d5d3c174c76c9d7614ec8fe735f8f82b6cc97a46b54f386a86bf"}, + {file = "shapely-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:865bc3d7cc0ea63189d11a0b1120d1307ed7a64720a8bfa5be2fde5fc6d0d33f"}, + {file = "shapely-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b4833235b90bc87ee26c6537438fa77559d994d2d3be5190dd2e54d31b2820"}, + {file = "shapely-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce88ec79df55430e37178a191ad8df45cae90b0f6972d46d867bf6ebbb58cc4d"}, + {file = "shapely-2.0.1-cp310-cp310-win32.whl", hash = "sha256:01224899ff692a62929ef1a3f5fe389043e262698a708ab7569f43a99a48ae82"}, + {file = "shapely-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:da71de5bf552d83dcc21b78cc0020e86f8d0feea43e202110973987ffa781c21"}, + {file = "shapely-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:502e0a607f1dcc6dee0125aeee886379be5242c854500ea5fd2e7ac076b9ce6d"}, + {file = "shapely-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d3bbeefd8a6a1a1017265d2d36f8ff2d79d0162d8c141aa0d37a87063525656"}, + {file = "shapely-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f470a130d6ddb05b810fc1776d918659407f8d025b7f56d2742a596b6dffa6c7"}, + {file = "shapely-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4641325e065fd3e07d55677849c9ddfd0cf3ee98f96475126942e746d55b17c8"}, + {file = "shapely-2.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90cfa4144ff189a3c3de62e2f3669283c98fb760cfa2e82ff70df40f11cadb39"}, + {file = "shapely-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70a18fc7d6418e5aea76ac55dce33f98e75bd413c6eb39cfed6a1ba36469d7d4"}, + {file = "shapely-2.0.1-cp311-cp311-win32.whl", hash = "sha256:09d6c7763b1bee0d0a2b84bb32a4c25c6359ad1ac582a62d8b211e89de986154"}, + {file = "shapely-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:d8f55f355be7821dade839df785a49dc9f16d1af363134d07eb11e9207e0b189"}, + {file = "shapely-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:83a8ec0ee0192b6e3feee9f6a499d1377e9c295af74d7f81ecba5a42a6b195b7"}, + {file = "shapely-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a529218e72a3dbdc83676198e610485fdfa31178f4be5b519a8ae12ea688db14"}, + {file = "shapely-2.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91575d97fd67391b85686573d758896ed2fc7476321c9d2e2b0c398b628b961c"}, + {file = "shapely-2.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8b0d834b11be97d5ab2b4dceada20ae8e07bcccbc0f55d71df6729965f406ad"}, + {file = "shapely-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:b4f0711cc83734c6fad94fc8d4ec30f3d52c1787b17d9dca261dc841d4731c64"}, + {file = "shapely-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:05c51a29336e604c084fb43ae5dbbfa2c0ef9bd6fedeae0a0d02c7b57a56ba46"}, + {file = "shapely-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b519cf3726ddb6c67f6a951d1bb1d29691111eaa67ea19ddca4d454fbe35949c"}, + {file = "shapely-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:193a398d81c97a62fc3634a1a33798a58fd1dcf4aead254d080b273efbb7e3ff"}, + {file = "shapely-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e55698e0ed95a70fe9ff9a23c763acfe0bf335b02df12142f74e4543095e9a9b"}, + {file = "shapely-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f32a748703e7bf6e92dfa3d2936b2fbfe76f8ce5f756e24f49ef72d17d26ad02"}, + {file = "shapely-2.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a34a23d6266ca162499e4a22b79159dc0052f4973d16f16f990baa4d29e58b6"}, + {file = "shapely-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d173d24e85e51510e658fb108513d5bc11e3fd2820db6b1bd0522266ddd11f51"}, + {file = "shapely-2.0.1-cp38-cp38-win32.whl", hash = "sha256:3cb256ae0c01b17f7bc68ee2ffdd45aebf42af8992484ea55c29a6151abe4386"}, + {file = "shapely-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c7eed1fb3008a8a4a56425334b7eb82651a51f9e9a9c2f72844a2fb394f38a6c"}, + {file = "shapely-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ac1dfc397475d1de485e76de0c3c91cc9d79bd39012a84bb0f5e8a199fc17bef"}, + {file = "shapely-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33403b8896e1d98aaa3a52110d828b18985d740cc9f34f198922018b1e0f8afe"}, + {file = "shapely-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2569a4b91caeef54dd5ae9091ae6f63526d8ca0b376b5bb9fd1a3195d047d7d4"}, + {file = "shapely-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a70a614791ff65f5e283feed747e1cc3d9e6c6ba91556e640636bbb0a1e32a71"}, + {file = "shapely-2.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43755d2c46b75a7b74ac6226d2cc9fa2a76c3263c5ae70c195c6fb4e7b08e79"}, + {file = "shapely-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad81f292fffbd568ae71828e6c387da7eb5384a79db9b4fde14dd9fdeffca9a"}, + {file = "shapely-2.0.1-cp39-cp39-win32.whl", hash = "sha256:b50c401b64883e61556a90b89948297f1714dbac29243d17ed9284a47e6dd731"}, + {file = "shapely-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bca57b683e3d94d0919e2f31e4d70fdfbb7059650ef1b431d9f4e045690edcd5"}, + {file = "shapely-2.0.1.tar.gz", hash = "sha256:66a6b1a3e72ece97fc85536a281476f9b7794de2e646ca8a4517e2e3c1446893"}, +] + +[package.dependencies] +numpy = ">=1.14" + +[package.extras] +docs = ["matplotlib", "numpydoc (>=1.1.0,<1.2.0)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] + [[package]] name = "six" version = "1.16.0" @@ -500,6 +1274,145 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "statsmodels" +version = "0.13.2" +description = "Statistical computations and models for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "statsmodels-0.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e7ca5b7e678c0bb7a24f5c735d58ac104a50eb61b17c484cce0e221a095560f"}, + {file = "statsmodels-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:066a75d5585378b2df972f81a90b9a3da5e567b7d4833300c1597438c1a35e29"}, + {file = "statsmodels-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f15f38dfc9c5c091662cb619e12322047368c67aef449c7554d9b324a15f7a94"}, + {file = "statsmodels-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c4ccc6b4744613367e8a233bd952c8a838db8f528f9fe033bda25aa13fc7d08"}, + {file = "statsmodels-0.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:855b1cc2a91ab140b9bcf304b1731705805ce73223bf500b988804968554c0ed"}, + {file = "statsmodels-0.13.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b69c9af7606325095f7c40c581957bad9f28775653d41537c1ec4cd1b185ff5b"}, + {file = "statsmodels-0.13.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab31bac0f72b83bca1f217a12ec6f309a56485a50c4a705fbdd63112213d4da4"}, + {file = "statsmodels-0.13.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d680b910b57fc0aa87472662cdfe09aae0e21db4bdf19ccd6420fd4dffda892"}, + {file = "statsmodels-0.13.2-cp37-cp37m-win32.whl", hash = "sha256:9e9a3f661d372431850d55157d049e079493c97fc06f550d23d8c8c70805cc48"}, + {file = "statsmodels-0.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c9f6326870c095ef688f072cd476b932aff0906d60193eaa08e93ec23b29ca83"}, + {file = "statsmodels-0.13.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bc050f25f1ba1221efef9ea01b751c60935ad787fcd4259f4ece986f2da9141"}, + {file = "statsmodels-0.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:426b1c8ea3918d3d27dbfa38f2bee36cabf41d32163e2cbb3adfb0178b24626a"}, + {file = "statsmodels-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b80fac4a63308b1e93fa9dc27a8598930fd5dfd77c850ca077bb850254c6d7"}, + {file = "statsmodels-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ee69ec0e0f79f627245c65f8a495b8581c2ea19084aac63941815feb15dcf3"}, + {file = "statsmodels-0.13.2-cp38-cp38-win32.whl", hash = "sha256:20483cc30e11aa072b30d307bb80470f86a23ae8fffa51439ca54509d7aa9b05"}, + {file = "statsmodels-0.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:bf43051a92231ccb9de95e4b6d22d3b15e499ee5ee9bff0a20e6b6ad293e34cb"}, + {file = "statsmodels-0.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bf0dfed5f5edb59b5922b295392cd276463b10a5e730f7e57ee4ff2d8e9a87e"}, + {file = "statsmodels-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a403b559c5586dab7ac0fc9e754c737b017c96cce0ddd66ff9094764cdaf293d"}, + {file = "statsmodels-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f23554dd025ea354ce072ba32bfaa840d2b856372e5734290e181d27a1f9e0c"}, + {file = "statsmodels-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815f4df713e3eb6f40ae175c71f2a70d32f9219b5b4d23d4e0faab1171ba93ba"}, + {file = "statsmodels-0.13.2-cp39-cp39-win32.whl", hash = "sha256:461c82ab2265fa8457b96afc23ef3ca19f42eb070436e0241b57e58a38863901"}, + {file = "statsmodels-0.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:39daab5a8a9332c8ea83d6464d065080c9ba65f236daf6a64aa18f64ef776fad"}, + {file = "statsmodels-0.13.2.tar.gz", hash = "sha256:77dc292c9939c036a476f1770f9d08976b05437daa229928da73231147cde7d4"}, +] + +[package.dependencies] +numpy = ">=1.17" +packaging = ">=21.3" +pandas = ">=0.25" +patsy = ">=0.5.2" +scipy = ">=1.3" + +[package.extras] +build = ["cython (>=0.29.26)"] +develop = ["cython (>=0.29.26)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + +[[package]] +name = "statsmodels" +version = "0.13.3" +description = "Statistical computations and models for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "statsmodels-0.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b71bb64c6d4087dd6192eadfad390fbeb4074f676ef34c7e56579cead8c478e7"}, + {file = "statsmodels-0.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:658b634c273c2f287a0086e56a5d6b95ec3ddac991cbb020b34f731e932de0bd"}, + {file = "statsmodels-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab9f63f432889b179967ab645aea7480e28731823a3b99850d7f7a561b624f93"}, + {file = "statsmodels-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f432fb7f54ce5edccc83aa36566653cd04ee35bbbefdf0a2b7bd9c97c5da443"}, + {file = "statsmodels-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:4cd64076c3ad366b10fd4e6f8ca6aeb1e398ec5480bddb65fba8889dd9eb550d"}, + {file = "statsmodels-0.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33f9caff2dbdfef22505678407d2f549b32a4a2729eb8675b60eb2932fc0e883"}, + {file = "statsmodels-0.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:393f6a7ec85f65be9ac1a13be152dd14c65084436c48bcdf94cb21ef0b6cb79c"}, + {file = "statsmodels-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12b56d13d9a2af7a1aadc3fe9f3d3c18a5727a651323d94e7c2047177adfb9ce"}, + {file = "statsmodels-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a61e0652f62b01981d8e857aa77550b42cf316c9d8e569b559869c248e3de834"}, + {file = "statsmodels-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:5368bccd471bb8cef0a8957ba5f2a3e5b5ecc433b0783d9f602039df45c780d3"}, + {file = "statsmodels-0.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1ecfb191958de187ba44b93316f4953b8b6588b5f68dcab218f76498a862dd7c"}, + {file = "statsmodels-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea2b481b15e9e501904a1c36efc5f9a202f87529e600a99c364fd7e4598ae88"}, + {file = "statsmodels-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d270a11aac6720a8024e1136ab44036d0878f62995617bb5b9fc5c77ea3d3b8"}, + {file = "statsmodels-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2185ed356823cd1c258c09b790f0c21d2fd49321e82c79f8f6dc546f1c671d7a"}, + {file = "statsmodels-0.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9da39a36d114abcdcf8ebd351ed69229e23cb12b8a607996cb6511fa88e78b4d"}, + {file = "statsmodels-0.13.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3b3a9942d0b462af4c68c3895095d304869cbec9d97f3c268f19a6ba7ba294dc"}, + {file = "statsmodels-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fff0316420bc4f6fbd80dd77eb74f3834fcd0e4ca98ba9611b8a6d41ebbb979"}, + {file = "statsmodels-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352041bc04eaf90232e54a86861a460365ef45f34f58529578487e6f640dadf3"}, + {file = "statsmodels-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:61a0f39848ebacf5560e1539ca0037b8fc25cc9d1d7444bbef5bdc0a3c56087b"}, + {file = "statsmodels-0.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:78cd12b0ee543fa955d2bace18518fc7d2b57f13c65929b54445bf3e54955b08"}, + {file = "statsmodels-0.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:afccb80e3ddc969bfb5285f846ac2622861ffe192423087214d60e4c6e40e384"}, + {file = "statsmodels-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3609824e1ced44722bd905564d8ce94df29d24e32a6dd67cc9255932aedcd7b"}, + {file = "statsmodels-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81f8e71963a7bd169338fbb1472e34ec85ae4447414ac37bdae5cf6d1ac223bb"}, + {file = "statsmodels-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:000c7a1ce6780834f5fbb63f9ae07a00863a00f602c7c470c942153692f5bbc3"}, + {file = "statsmodels-0.13.3.tar.gz", hash = "sha256:ed71df887334b1d332e71d33215122bdd54494dcb2248606b30bcfa6112e860a"}, +] + +[package.dependencies] +numpy = {version = ">=1.17", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""} +packaging = ">=21.3" +pandas = ">=0.25" +patsy = ">=0.5.2" +scipy = {version = ">=1.3", markers = "(python_version > \"3.7\" or platform_system != \"Windows\" or platform_machine != \"x86\") and python_version < \"3.12\""} + +[package.extras] +build = ["cython (>=0.29.32)"] +develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + +[[package]] +name = "statsmodels" +version = "0.13.4" +description = "Statistical computations and models for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "statsmodels-0.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:41b94ae84f1bf77a0dfadf88d153189735c96218bc72e2b8309bc74393f026bb"}, + {file = "statsmodels-0.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e5d7b16cbfae069effeda91ba713f36300b2afcb1ccd0c6d2617771910d97e0f"}, + {file = "statsmodels-0.13.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57b4c90ccf776c6848aca94b7bd7e0d79f4b161baca179a8e2fbc727e2ff613b"}, + {file = "statsmodels-0.13.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef075faad0a4ca9972dca7e2f3ed5538923c97639aa2ef7dcc6bff2398e15a24"}, + {file = "statsmodels-0.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:aa1c157c7fae3f7be5daed308cb928bba320005de51cfb59681bec157a6fca99"}, + {file = "statsmodels-0.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33dc53eda31ac4f0d06ab4b30d4877f8f09d417a1120f0b919b0258b95335f44"}, + {file = "statsmodels-0.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5e37fd711f7436c92c9e24a6fc0cb9f22d87fc0d2ce0f3ee47c11d75983f28a"}, + {file = "statsmodels-0.13.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d42683f2a8e51b67bc286a5bf4a573613ef1d1d12d66925367695f36a8667589"}, + {file = "statsmodels-0.13.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0a92b3dd2bcd1bef6363c824421c8532f24d7f1a88f55f0d2bc99f6ad4ff2a2"}, + {file = "statsmodels-0.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:98b33318d3366eeb3631a9caf317cc667a36866c4b69d488ffa70dee9af37959"}, + {file = "statsmodels-0.13.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:80a5014be675ed2d5ebc0ef4ccbb7d3dba63bab2d0d4f780b51429d51f3aa2e6"}, + {file = "statsmodels-0.13.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91ec9ebfe4e74b33cc6b2007b3ee53d1fa7ceae90589fcd10de213bbebada2d7"}, + {file = "statsmodels-0.13.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecba51dda0583afcb8b179df380b3e9217bde405e24490d4124ac9b0cd1bf20d"}, + {file = "statsmodels-0.13.4-cp37-cp37m-win_amd64.whl", hash = "sha256:00b41f3d2c2a563d95abc1b948cf54c910e8f4c1bc42696380344708ce6882d9"}, + {file = "statsmodels-0.13.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1818c0f366a50c873e56d8c18925c188c691e0c2cd80ea7cdcd2d3b71788290f"}, + {file = "statsmodels-0.13.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e8be9d7e2d3c7b2dd8162022667e5352c96c3334087c6cb9e352f7dc310cca8e"}, + {file = "statsmodels-0.13.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5916bd3d63370bf53711dea3f309e08d634c72859973a22384ade2a00e6675"}, + {file = "statsmodels-0.13.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bdcd7938c0cadbf4be632407dbc6cf5d9ce3234cfe1c9a37e9cc61d717e6e27"}, + {file = "statsmodels-0.13.4-cp38-cp38-win_amd64.whl", hash = "sha256:b10e712dc51c814db2578530d3d64e982d265312636b520952db63c555b9b4e2"}, + {file = "statsmodels-0.13.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e44542d45d242c24eaf960e95e54cbc83cfeb07922e14c78f2771c4e81ffd6f7"}, + {file = "statsmodels-0.13.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:606e5aa5ca33a5468c5065f4b9dfc249d7f499f262c0d84a514f4346fd97f049"}, + {file = "statsmodels-0.13.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e3e379d3c6ecdcb5065541c36a1b2421f6a27a8c4cbeec488b917631a7d207a"}, + {file = "statsmodels-0.13.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:719a0d175dae8466112d5847adc49e0f76adf4bb735b03ff2b73b97140712d09"}, + {file = "statsmodels-0.13.4-cp39-cp39-win_amd64.whl", hash = "sha256:7d50c9c9ecdf23e1b8339cfa839f689817467c4f4a4ae8561b655faa3dc53f5f"}, + {file = "statsmodels-0.13.4.tar.gz", hash = "sha256:8ee5d1b69f64bc0e9379667455ee3585849d5e6bcd3f3e48e58ba6cadadfead5"}, +] + +[package.dependencies] +numpy = {version = ">=1.17", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""} +packaging = ">=21.3" +pandas = ">=0.25" +patsy = ">=0.5.2" +scipy = {version = ">=1.3", markers = "(python_version > \"3.9\" or platform_system != \"Windows\" or platform_machine != \"x86\") and python_version < \"3.12\""} + +[package.extras] +build = ["cython (>=0.29.32)"] +develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + [[package]] name = "statsmodels" version = "0.13.5" @@ -543,10 +1456,7 @@ numpy = [ packaging = ">=21.3" pandas = ">=0.25" patsy = ">=0.5.2" -scipy = [ - {version = ">=1.3", markers = "(python_version > \"3.9\" or platform_system != \"Windows\" or platform_machine != \"x86\") and python_version < \"3.12\""}, - {version = ">=1.3,<1.9", markers = "python_version == \"3.8\" and platform_system == \"Windows\" and platform_machine == \"x86\" or python_version == \"3.9\" and platform_system == \"Windows\" and platform_machine == \"x86\""}, -] +scipy = {version = ">=1.3", markers = "(python_version > \"3.9\" or platform_system != \"Windows\" or platform_machine != \"x86\") and python_version < \"3.12\""} [package.extras] build = ["cython (>=0.29.32)"] @@ -568,6 +1478,42 @@ files = [ [package.extras] doc = ["reno", "sphinx", "tornado (>=4.5)"] +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.11.6" +description = "Style preserving TOML library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, +] + +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + [[package]] name = "urllib3" version = "1.26.14" @@ -585,7 +1531,126 @@ brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "werkzeug" +version = "2.2.3" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Werkzeug-2.2.3-py3-none-any.whl", hash = "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"}, + {file = "Werkzeug-2.2.3.tar.gz", hash = "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog"] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "ce46ccaf57b561d079794a1be6785ea99fa2b6d14e1916c37d6e71b090f0f4c2" +content-hash = "e2c0a95254fbcd672a714663326bd20c114d5cab30d906ab18d21a1d77e089f3" diff --git a/proj-paper.pdf b/proj-paper.pdf new file mode 100644 index 0000000..1fc2a02 Binary files /dev/null and b/proj-paper.pdf differ diff --git a/pyproject.toml b/pyproject.toml index 57bd0ed..3a1b398 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "0.1.0" description = "" authors = ["Harsh Vardhan Pachisia "] readme = "README.md" -packages = [{include = "30122_project_snow_lm"}] +packages = [{include = "snowlm"}] [tool.poetry.dependencies] python = "^3.8" @@ -12,6 +12,16 @@ pandas = "^1.5.3" requests = "^2.28.2" lxml = "^4.9.2" plotly-express = "^0.4.1" +dash = "^2.8.1" +plotly-geo = "^1.0.0" +geopandas = "^0.12.2" +pyshp = "^2.3.1" +dash-bootstrap-components = "^1.4.0" +cssselect = "^1.2.0" +dash-table = "^5.0.0" +dash-bootstrap-templates = "^1.0.8" +black = "^23.1.0" +pylint = "^2.16.4" [build-system] diff --git a/snowlm/EDA/census_disaster_data_merged_eda.py b/snowlm/EDA/census_disaster_data_merged_eda.py new file mode 100644 index 0000000..8d41d71 --- /dev/null +++ b/snowlm/EDA/census_disaster_data_merged_eda.py @@ -0,0 +1,50 @@ +''' +CAPP 30122 +Team: Snow Laughing Matter +Primary Author: Jennifer Yeaton + +Purpose: Exploratory data analysis of county list with disaster data and census data. + Merging list of counties with disaster data into census dataset. +''' + +import pandas as pd +import pprint +from snowlm.scrape_api.census_api_query import api_query +from snowlm.data.climate import get_cleaned_data, counties_affected_by_disasters + + +def merge_data_census_disaster(): + ''' + Merge list of counties with disaster data into census dataset. + + Inputs: + None + + Returns: + Pandas dataframe with census and disaster data merged together. + ''' + + full_census_df = api_query() + cleaned_data_df = get_cleaned_data("disaster_declarations.csv") + + counties_with_disaster_list = counties_affected_by_disasters(get_cleaned_data("disaster_declarations.csv", only_2000_onwards = True)) + column_name = ["state_and_county_code"] + counties_with_disaster_df = pd.DataFrame(columns = column_name, data = counties_with_disaster_list) + + #Check data types for county_code: + print(full_census_df.dtypes) + print(counties_with_disaster_df.dtypes) + + #Look at head of each dataset: + print(full_census_df.head) + print(counties_with_disaster_df.head) + + #Add binary variable for whether disaster data exists: + counties_with_disaster_df["county_has_disaster_data"] = 1 + + #Merge datasets + census_data_w_disaster_counties_df = full_census_df.merge(counties_with_disaster_df, + how = "left", on = "state_and_county_code") + + #Return counties_with_disaster_df, full_census_df + return census_data_w_disaster_counties_df \ No newline at end of file diff --git a/snowlm/EDA/climate_data.ipynb b/snowlm/EDA/climate_data.ipynb deleted file mode 100644 index 82c4559..0000000 --- a/snowlm/EDA/climate_data.ipynb +++ /dev/null @@ -1,1936 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Severe Climate Events: Disaster Declaration for states and counties\n", - "Exploratory Data Analysis by Harsh Vardhan Pachisia" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [], - "source": [ - "disasters_raw = pd.read_csv(\"disaster_declarations.csv\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Understanding the raw data" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
femaDeclarationStringdisasterNumberstatedeclarationTypedeclarationDatefyDeclaredincidentTypedeclarationTitleihProgramDeclarediaProgramDeclared...disasterCloseoutDatefipsStateCodefipsCountyCodeplaceCodedesignatedAreadeclarationRequestNumberlastIAFilingDatehashidlastRefresh
0FM-5444-TX5444TXFM2022-07-19T00:00:00.000Z2022FireCHALK MOUNTAIN FIRE00...NaN4822199221Hood (County)22060NaN373c5ec27998afc08a53302dae796f476b1a6546867be42a-71d5-4f13-aa21-d91e0a6fd5772022-07-20T21:21:23.941Z
1FM-5436-NE5436NEFM2022-04-23T00:00:00.000Z2022FireROAD 702 FIRE00...NaN316399063Frontier (County)22034NaNea3487ef36cff455236ce4c63d32fb8b5412bcefe671348b-9782-42df-99f4-d38b8b1a89e62022-07-20T21:21:23.942Z
2FM-5444-TX5444TXFM2022-07-19T00:00:00.000Z2022FireCHALK MOUNTAIN FIRE00...NaN4842599425Somervell (County)22060NaN1f35dd8137e1b4cf003fb73d53d8aaaf642e619040f3ff75-0b80-4d25-8e85-156cd6a6f40b2022-07-20T21:21:23.943Z
3FM-5436-NE5436NEFM2022-04-23T00:00:00.000Z2022FireROAD 702 FIRE00...NaN316599065Furnas (County)22034NaN9d813a845ab86f546bdf642fda53d3d4a0fbd098de47838f-32db-4058-a34c-64997333789e2022-07-20T21:21:23.943Z
4FM-5436-NE5436NEFM2022-04-23T00:00:00.000Z2022FireROAD 702 FIRE00...NaN3114599145Red Willow (County)22034NaNd436856ce1d5205fa78597b93661fb27d3cea796483c03b7-160a-414e-bb4f-5ccecc18d94a2022-07-20T21:21:23.944Z
\n", - "

5 rows × 24 columns

\n", - "
" - ], - "text/plain": [ - " femaDeclarationString disasterNumber state declarationType \\\n", - "0 FM-5444-TX 5444 TX FM \n", - "1 FM-5436-NE 5436 NE FM \n", - "2 FM-5444-TX 5444 TX FM \n", - "3 FM-5436-NE 5436 NE FM \n", - "4 FM-5436-NE 5436 NE FM \n", - "\n", - " declarationDate fyDeclared incidentType declarationTitle \\\n", - "0 2022-07-19T00:00:00.000Z 2022 Fire CHALK MOUNTAIN FIRE \n", - "1 2022-04-23T00:00:00.000Z 2022 Fire ROAD 702 FIRE \n", - "2 2022-07-19T00:00:00.000Z 2022 Fire CHALK MOUNTAIN FIRE \n", - "3 2022-04-23T00:00:00.000Z 2022 Fire ROAD 702 FIRE \n", - "4 2022-04-23T00:00:00.000Z 2022 Fire ROAD 702 FIRE \n", - "\n", - " ihProgramDeclared iaProgramDeclared ... disasterCloseoutDate \\\n", - "0 0 0 ... NaN \n", - "1 0 0 ... NaN \n", - "2 0 0 ... NaN \n", - "3 0 0 ... NaN \n", - "4 0 0 ... NaN \n", - "\n", - " fipsStateCode fipsCountyCode placeCode designatedArea \\\n", - "0 48 221 99221 Hood (County) \n", - "1 31 63 99063 Frontier (County) \n", - "2 48 425 99425 Somervell (County) \n", - "3 31 65 99065 Furnas (County) \n", - "4 31 145 99145 Red Willow (County) \n", - "\n", - " declarationRequestNumber lastIAFilingDate \\\n", - "0 22060 NaN \n", - "1 22034 NaN \n", - "2 22060 NaN \n", - "3 22034 NaN \n", - "4 22034 NaN \n", - "\n", - " hash \\\n", - "0 373c5ec27998afc08a53302dae796f476b1a6546 \n", - "1 ea3487ef36cff455236ce4c63d32fb8b5412bcef \n", - "2 1f35dd8137e1b4cf003fb73d53d8aaaf642e6190 \n", - "3 9d813a845ab86f546bdf642fda53d3d4a0fbd098 \n", - "4 d436856ce1d5205fa78597b93661fb27d3cea796 \n", - "\n", - " id lastRefresh \n", - "0 867be42a-71d5-4f13-aa21-d91e0a6fd577 2022-07-20T21:21:23.941Z \n", - "1 e671348b-9782-42df-99f4-d38b8b1a89e6 2022-07-20T21:21:23.942Z \n", - "2 40f3ff75-0b80-4d25-8e85-156cd6a6f40b 2022-07-20T21:21:23.943Z \n", - "3 de47838f-32db-4058-a34c-64997333789e 2022-07-20T21:21:23.943Z \n", - "4 483c03b7-160a-414e-bb4f-5ccecc18d94a 2022-07-20T21:21:23.944Z \n", - "\n", - "[5 rows x 24 columns]" - ] - }, - "execution_count": 123, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "disasters_raw.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 63989 entries, 0 to 63988\n", - "Data columns (total 24 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 femaDeclarationString 63989 non-null object\n", - " 1 disasterNumber 63989 non-null int64 \n", - " 2 state 63989 non-null object\n", - " 3 declarationType 63989 non-null object\n", - " 4 declarationDate 63989 non-null object\n", - " 5 fyDeclared 63989 non-null int64 \n", - " 6 incidentType 63989 non-null object\n", - " 7 declarationTitle 63989 non-null object\n", - " 8 ihProgramDeclared 63989 non-null int64 \n", - " 9 iaProgramDeclared 63989 non-null int64 \n", - " 10 paProgramDeclared 63989 non-null int64 \n", - " 11 hmProgramDeclared 63989 non-null int64 \n", - " 12 incidentBeginDate 63989 non-null object\n", - " 13 incidentEndDate 55609 non-null object\n", - " 14 disasterCloseoutDate 49425 non-null object\n", - " 15 fipsStateCode 63989 non-null int64 \n", - " 16 fipsCountyCode 63989 non-null int64 \n", - " 17 placeCode 63989 non-null int64 \n", - " 18 designatedArea 63989 non-null object\n", - " 19 declarationRequestNumber 63989 non-null int64 \n", - " 20 lastIAFilingDate 17734 non-null object\n", - " 21 hash 63989 non-null object\n", - " 22 id 63989 non-null object\n", - " 23 lastRefresh 63989 non-null object\n", - "dtypes: int64(10), object(14)\n", - "memory usage: 11.7+ MB\n" - ] - } - ], - "source": [ - "disasters_raw.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": {}, - "outputs": [], - "source": [ - "# keeping only the possibly relevant columns\n", - "disasters = disasters_raw[[\n", - " 'id','disasterNumber', 'state','fipsStateCode','fipsCountyCode','placeCode',\n", - " 'declarationDate','fyDeclared','incidentType', 'ihProgramDeclared',\n", - " 'iaProgramDeclared','paProgramDeclared','hmProgramDeclared',\n", - " 'incidentBeginDate','incidentEndDate','designatedArea']]" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Understanding the type of disasters present" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 63989\n", - "unique 26\n", - "top Severe Storm\n", - "freq 17467\n", - "Name: incidentType, dtype: object" - ] - }, - "execution_count": 126, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "disasters.incidentType.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Severe Storm 17467\n", - "Hurricane 13055\n", - "Flood 10634\n", - "Biological 7857\n", - "Snowstorm 3702\n", - "Fire 3615\n", - "Severe Ice Storm 2942\n", - "Tornado 1569\n", - "Drought 1292\n", - "Coastal Storm 638\n", - "Other 307\n", - "Freezing 301\n", - "Earthquake 227\n", - "Typhoon 130\n", - "Tropical Storm 54\n", - "Volcanic Eruption 51\n", - "Fishing Losses 42\n", - "Mud/Landslide 37\n", - "Winter Storm 13\n", - "Dam/Levee Break 13\n", - "Toxic Substances 9\n", - "Chemical 9\n", - "Tsunami 9\n", - "Human Cause 7\n", - "Terrorist 5\n", - "Severe Storm(s) 4\n", - "Name: incidentType, dtype: int64" - ] - }, - "execution_count": 127, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "disasters.incidentType.value_counts()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Two points of note: \n", - "1. There are non-natural disasters in this data that need to be removed including: 'Biological','Toxic Substances','Chemical','Terrorist','Human Cause','Fishing Losses'. \n", - "2. 'Severe Storms' and 'Severe Storm(s)' are repeated, needs to be checked." - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
iddisasterNumberstatefipsStateCodefipsCountyCodeplaceCodedeclarationDatefyDeclaredincidentTypeihProgramDeclarediaProgramDeclaredpaProgramDeclaredhmProgramDeclaredincidentBeginDateincidentEndDatedesignatedArea
23681a43a83c2-7510-4326-8902-c76c15973d4c4672AK216642002022-09-23T00:00:00.000Z2022Severe Storm00112022-09-15T00:00:00.000Z2022-09-20T00:00:00.000ZPribilof Island Regional Educational Attendanc...
44180ddbab9c1-0745-4cbe-9c5e-208720c757784672AK2002022-09-23T00:00:00.000Z2022Severe Storm(s)00102022-09-15T00:00:00.000Z2022-09-20T00:00:00.000ZStatewide
44206d5b9927b-cc85-48cf-bf93-ad1956b45b4c4672AK218063622022-09-23T00:00:00.000Z2022Severe Storm10112022-09-15T00:00:00.000Z2022-09-20T00:00:00.000ZBering Strait Regional Educational Attendance ...
442333558214a-9c3e-4834-af38-d1cde648fd0d4672AK2270378402022-09-23T00:00:00.000Z2022Severe Storm10112022-09-15T00:00:00.000Z2022-09-20T00:00:00.000ZKashunamiut Regional Educational Attendance Area
442595b16d89e-f5de-4e66-8ad2-0911733af9074672AK250456902022-09-23T00:00:00.000Z2022Severe Storm10112022-09-15T00:00:00.000Z2022-09-20T00:00:00.000ZLower Yukon Regional Educational Attendance Area
442848f381b32-2e35-437c-9a7d-c52a08d9a44e4672AK250455402022-09-23T00:00:00.000Z2022Severe Storm10112022-09-15T00:00:00.000Z2022-09-20T00:00:00.000ZLower Kuskokwim Regional Educational Attendanc...
\n", - "
" - ], - "text/plain": [ - " id disasterNumber state \\\n", - "23681 a43a83c2-7510-4326-8902-c76c15973d4c 4672 AK \n", - "44180 ddbab9c1-0745-4cbe-9c5e-208720c75778 4672 AK \n", - "44206 d5b9927b-cc85-48cf-bf93-ad1956b45b4c 4672 AK \n", - "44233 3558214a-9c3e-4834-af38-d1cde648fd0d 4672 AK \n", - "44259 5b16d89e-f5de-4e66-8ad2-0911733af907 4672 AK \n", - "44284 8f381b32-2e35-437c-9a7d-c52a08d9a44e 4672 AK \n", - "\n", - " fipsStateCode fipsCountyCode placeCode declarationDate \\\n", - "23681 2 16 64200 2022-09-23T00:00:00.000Z \n", - "44180 2 0 0 2022-09-23T00:00:00.000Z \n", - "44206 2 180 6362 2022-09-23T00:00:00.000Z \n", - "44233 2 270 37840 2022-09-23T00:00:00.000Z \n", - "44259 2 50 45690 2022-09-23T00:00:00.000Z \n", - "44284 2 50 45540 2022-09-23T00:00:00.000Z \n", - "\n", - " fyDeclared incidentType ihProgramDeclared iaProgramDeclared \\\n", - "23681 2022 Severe Storm 0 0 \n", - "44180 2022 Severe Storm(s) 0 0 \n", - "44206 2022 Severe Storm 1 0 \n", - "44233 2022 Severe Storm 1 0 \n", - "44259 2022 Severe Storm 1 0 \n", - "44284 2022 Severe Storm 1 0 \n", - "\n", - " paProgramDeclared hmProgramDeclared incidentBeginDate \\\n", - "23681 1 1 2022-09-15T00:00:00.000Z \n", - "44180 1 0 2022-09-15T00:00:00.000Z \n", - "44206 1 1 2022-09-15T00:00:00.000Z \n", - "44233 1 1 2022-09-15T00:00:00.000Z \n", - "44259 1 1 2022-09-15T00:00:00.000Z \n", - "44284 1 1 2022-09-15T00:00:00.000Z \n", - "\n", - " incidentEndDate \\\n", - "23681 2022-09-20T00:00:00.000Z \n", - "44180 2022-09-20T00:00:00.000Z \n", - "44206 2022-09-20T00:00:00.000Z \n", - "44233 2022-09-20T00:00:00.000Z \n", - "44259 2022-09-20T00:00:00.000Z \n", - "44284 2022-09-20T00:00:00.000Z \n", - "\n", - " designatedArea \n", - "23681 Pribilof Island Regional Educational Attendanc... \n", - "44180 Statewide \n", - "44206 Bering Strait Regional Educational Attendance ... \n", - "44233 Kashunamiut Regional Educational Attendance Area \n", - "44259 Lower Yukon Regional Educational Attendance Area \n", - "44284 Lower Kuskokwim Regional Educational Attendanc... " - ] - }, - "execution_count": 128, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "disasters.loc[disasters[\"incidentType\"] == \"Severe Storm(s)\"]\n", - "# only 3 severe storms(s) (based on disaster numbers). \n", - "# check if they overlap with 'Severe Storm'.\n", - "disasters.loc[disasters[\"disasterNumber\"] == 4670]\n", - "disasters.loc[disasters[\"disasterNumber\"] == 4664]\n", - "disasters.loc[disasters[\"disasterNumber\"] == 4672]\n", - "# each severe storms(s) overlaps with 'Severe Storm'\n", - "# can be removed from the dataset to avoid duplication. " - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Calculating the number of disasters by incident type and removing the ones that are not climate disasters. " - ] - }, - { - "cell_type": "code", - "execution_count": 129, - "metadata": {}, - "outputs": [], - "source": [ - "disaster_type_list = disasters.incidentType.unique().tolist()\n", - "disaster_type_list\n", - "#removing severe storm(s) since they are only 3 which are statewide emergencies that are already covered by severe storm- duplicates\n", - "unwanted_disasters = ['Biological','Toxic Substances','Chemical','Terrorist',\n", - " 'Human Cause','Fishing Losses', 'Severe Storm(s)']\n", - "climate_disasters_list = [ele for ele in disaster_type_list \n", - " if ele not in unwanted_disasters]\n", - "climate_disasters = disasters.loc[\n", - " disasters['incidentType'].isin(climate_disasters_list)]" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Checking for state-wide disasters that can be removed if they are already covered by a county, to ensure that county codes of 0 are not kept in the dataset. " - ] - }, - { - "cell_type": "code", - "execution_count": 130, - "metadata": {}, - "outputs": [], - "source": [ - "state_wide_disasters = disasters.loc[disasters[\"designatedArea\"] == \"Statewide\"]" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Subsetting the data to the last 23 years (2000-2022). " - ] - }, - { - "cell_type": "code", - "execution_count": 131, - "metadata": {}, - "outputs": [], - "source": [ - "climate_disasters[\"declarationDate\"] = pd.to_datetime(\n", - " climate_disasters[\"declarationDate\"])\n", - "pd.options.mode.chained_assignment = None\n", - "# adding a year column\n", - "climate_disasters['Year'] = climate_disasters[\n", - " 'declarationDate'].dt.strftime('%Y')" - ] - }, - { - "cell_type": "code", - "execution_count": 132, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
iddisasterNumberstatefipsStateCodefipsCountyCodeplaceCodedeclarationDatefyDeclaredincidentTypeihProgramDeclarediaProgramDeclaredpaProgramDeclaredhmProgramDeclaredincidentBeginDateincidentEndDatedesignatedAreaYear
0867be42a-71d5-4f13-aa21-d91e0a6fd5775444TX48221992212022-07-19 00:00:00+00:002022Fire00112022-07-18T00:00:00.000ZNaNHood (County)2022
1e671348b-9782-42df-99f4-d38b8b1a89e65436NE3163990632022-04-23 00:00:00+00:002022Fire00112022-04-22T00:00:00.000ZNaNFrontier (County)2022
240f3ff75-0b80-4d25-8e85-156cd6a6f40b5444TX48425994252022-07-19 00:00:00+00:002022Fire00112022-07-18T00:00:00.000ZNaNSomervell (County)2022
3de47838f-32db-4058-a34c-64997333789e5436NE3165990652022-04-23 00:00:00+00:002022Fire00112022-04-22T00:00:00.000ZNaNFurnas (County)2022
4483c03b7-160a-414e-bb4f-5ccecc18d94a5436NE31145991452022-04-23 00:00:00+00:002022Fire00112022-04-22T00:00:00.000ZNaNRed Willow (County)2022
\n", - "
" - ], - "text/plain": [ - " id disasterNumber state fipsStateCode \\\n", - "0 867be42a-71d5-4f13-aa21-d91e0a6fd577 5444 TX 48 \n", - "1 e671348b-9782-42df-99f4-d38b8b1a89e6 5436 NE 31 \n", - "2 40f3ff75-0b80-4d25-8e85-156cd6a6f40b 5444 TX 48 \n", - "3 de47838f-32db-4058-a34c-64997333789e 5436 NE 31 \n", - "4 483c03b7-160a-414e-bb4f-5ccecc18d94a 5436 NE 31 \n", - "\n", - " fipsCountyCode placeCode declarationDate fyDeclared \\\n", - "0 221 99221 2022-07-19 00:00:00+00:00 2022 \n", - "1 63 99063 2022-04-23 00:00:00+00:00 2022 \n", - "2 425 99425 2022-07-19 00:00:00+00:00 2022 \n", - "3 65 99065 2022-04-23 00:00:00+00:00 2022 \n", - "4 145 99145 2022-04-23 00:00:00+00:00 2022 \n", - "\n", - " incidentType ihProgramDeclared iaProgramDeclared paProgramDeclared \\\n", - "0 Fire 0 0 1 \n", - "1 Fire 0 0 1 \n", - "2 Fire 0 0 1 \n", - "3 Fire 0 0 1 \n", - "4 Fire 0 0 1 \n", - "\n", - " hmProgramDeclared incidentBeginDate incidentEndDate \\\n", - "0 1 2022-07-18T00:00:00.000Z NaN \n", - "1 1 2022-04-22T00:00:00.000Z NaN \n", - "2 1 2022-07-18T00:00:00.000Z NaN \n", - "3 1 2022-04-22T00:00:00.000Z NaN \n", - "4 1 2022-04-22T00:00:00.000Z NaN \n", - "\n", - " designatedArea Year \n", - "0 Hood (County) 2022 \n", - "1 Frontier (County) 2022 \n", - "2 Somervell (County) 2022 \n", - "3 Furnas (County) 2022 \n", - "4 Red Willow (County) 2022 " - ] - }, - "execution_count": 132, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# subsetting the data\n", - "climate_last_23 = climate_disasters.loc[(climate_disasters['Year'] >= '2000')\n", - " & (climate_disasters['Year'] <= '2023')]\n", - "climate_last_23.head()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we take all years- we have 52,445 counties that have been affected by climate-related disasters. If we take from 2000 onwards (2000-2022 included), we get 36,340 counties that have been affected by climate-related disasters. " - ] - }, - { - "cell_type": "code", - "execution_count": 133, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 133, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Renaming climate columns\n", - "climate_last_23.columns = ['record_id', 'disaster_number', 'state', 'state_code',\n", - " 'county_code','place_code','dec_date', 'fiscal_year',\n", - " 'disaster_type','ih_program','ia_program', 'pa_program',\n", - " 'hm_progam','begin_date', 'end_date', 'area_name','year']\n", - "cliate_last_23 = climate_last_23.drop(columns=['fiscal_year'])\n", - "# checking for duplicate rows\n", - "duplicateRows = climate_last_23[climate_last_23.duplicated(['record_id'])]\n", - "len(duplicateRows)" - ] - }, - { - "cell_type": "code", - "execution_count": 134, - "metadata": {}, - "outputs": [], - "source": [ - "climate_last_23 = climate_last_23.drop(columns=['record_id'])" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Does not look like there are any duplicates that we need to worry about. \n", - "Hence, dropping the record_id column." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Deciding on economic assistance program to analyze. " - ] - }, - { - "cell_type": "code", - "execution_count": 135, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1 0.613478\n", - "0 0.386522\n", - "Name: hm_progam, dtype: float64" - ] - }, - "execution_count": 135, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "total_number_of_counties_affected = climate_last_23.shape[0]\n", - "climate_last_23.hm_progam.value_counts()/total_number_of_counties_affected" - ] - }, - { - "cell_type": "code", - "execution_count": 136, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 0.817403\n", - "1 0.182597\n", - "Name: ih_program, dtype: float64" - ] - }, - "execution_count": 136, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "climate_last_23.ih_program.value_counts()/total_number_of_counties_affected" - ] - }, - { - "cell_type": "code", - "execution_count": 137, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 0.864645\n", - "1 0.135355\n", - "Name: ia_program, dtype: float64" - ] - }, - "execution_count": 137, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "climate_last_23.ia_program.value_counts()/total_number_of_counties_affected" - ] - }, - { - "cell_type": "code", - "execution_count": 138, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1 0.941394\n", - "0 0.058606\n", - "Name: pa_program, dtype: float64" - ] - }, - "execution_count": 138, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "climate_last_23.pa_program.value_counts()/total_number_of_counties_affected" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Hazard Mitigation declared: 61.34%\n", - "\n", - "Individual and Households: 81.71%\n", - "\n", - "Individual Assistance: 86.46%\n", - "\n", - "Public Assistance: 94.13%\n", - "\n", - "Keeping only Public assistance column as it has the highest coverage in our dataset, is the largest program under FEMA, and hence, has the largest economic impact. \n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 139, - "metadata": {}, - "outputs": [], - "source": [ - "climate_last_23 = climate_last_23.drop(columns=[\n", - " 'ih_program','ia_program','hm_progam'])" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Questions to answer:\n", - "\n", - "1. What are the type of disasters that are occuring?\n", - "\n", - "2. What % of disasters are getting some kind of economic assistance?\n", - "\n", - "- Where does that economic assistance acctually flow to- which states?\n", - "\n", - "3. Which months are causing what kind of disasters? Which month has the most disasters?\n", - "\n", - "4. Which counties face the most disasters? \n", - "\n", - "5. Can add the public assistance data- map it to the specific disasters-\n", - "based on disaster numbers. See how much money goes to each state. Which kind of disaster gets the most amount of money as well. \n", - "Use public assistance cause it is the largest grant that FEMA provides. \n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a final county code to merge it with the census data. " - ] - }, - { - "cell_type": "code", - "execution_count": 140, - "metadata": {}, - "outputs": [], - "source": [ - "#remove records that have 0's in the county code- they are ones that are \n", - "# state-wide disasters and are already covered by other rows. \n", - "climate_last_23.drop(climate_last_23[climate_last_23['county_code'] == 0].index,\n", - " inplace = True)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Adding final_county_code by cleaning state code and county_code and merging them\n", - "together. " - ] - }, - { - "cell_type": "code", - "execution_count": 141, - "metadata": {}, - "outputs": [], - "source": [ - "climate_last_23[\"state_code\"] = climate_last_23.state_code.map(\"{:02d}\".format)" - ] - }, - { - "cell_type": "code", - "execution_count": 142, - "metadata": {}, - "outputs": [], - "source": [ - "climate_last_23[\"county_code\"] = climate_last_23.county_code.map(\"{:03d}\".format)" - ] - }, - { - "cell_type": "code", - "execution_count": 143, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
disaster_numberstatestate_codecounty_codeplace_codedec_datefiscal_yeardisaster_typepa_programbegin_dateend_datearea_nameyearfull_county_code
05444TX48221992212022-07-19 00:00:00+00:002022Fire12022-07-18T00:00:00.000ZNaNHood (County)202248221
15436NE31063990632022-04-23 00:00:00+00:002022Fire12022-04-22T00:00:00.000ZNaNFrontier (County)202231063
25444TX48425994252022-07-19 00:00:00+00:002022Fire12022-07-18T00:00:00.000ZNaNSomervell (County)202248425
35436NE31065990652022-04-23 00:00:00+00:002022Fire12022-04-22T00:00:00.000ZNaNFurnas (County)202231065
45436NE31145991452022-04-23 00:00:00+00:002022Fire12022-04-22T00:00:00.000ZNaNRed Willow (County)202231145
\n", - "
" - ], - "text/plain": [ - " disaster_number state state_code county_code place_code \\\n", - "0 5444 TX 48 221 99221 \n", - "1 5436 NE 31 063 99063 \n", - "2 5444 TX 48 425 99425 \n", - "3 5436 NE 31 065 99065 \n", - "4 5436 NE 31 145 99145 \n", - "\n", - " dec_date fiscal_year disaster_type pa_program \\\n", - "0 2022-07-19 00:00:00+00:00 2022 Fire 1 \n", - "1 2022-04-23 00:00:00+00:00 2022 Fire 1 \n", - "2 2022-07-19 00:00:00+00:00 2022 Fire 1 \n", - "3 2022-04-23 00:00:00+00:00 2022 Fire 1 \n", - "4 2022-04-23 00:00:00+00:00 2022 Fire 1 \n", - "\n", - " begin_date end_date area_name year \\\n", - "0 2022-07-18T00:00:00.000Z NaN Hood (County) 2022 \n", - "1 2022-04-22T00:00:00.000Z NaN Frontier (County) 2022 \n", - "2 2022-07-18T00:00:00.000Z NaN Somervell (County) 2022 \n", - "3 2022-04-22T00:00:00.000Z NaN Furnas (County) 2022 \n", - "4 2022-04-22T00:00:00.000Z NaN Red Willow (County) 2022 \n", - "\n", - " full_county_code \n", - "0 48221 \n", - "1 31063 \n", - "2 48425 \n", - "3 31065 \n", - "4 31145 " - ] - }, - "execution_count": 143, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "climate_last_23['full_county_code'] = (climate_last_23['state_code'] + \n", - " climate_last_23['county_code'])\n", - "climate_last_23.head()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### What are the type of disasters and frequency of disasters?" - ] - }, - { - "cell_type": "code", - "execution_count": 144, - "metadata": {}, - "outputs": [], - "source": [ - "cl= climate_last_23.disaster_number.value_counts().to_dict()\n", - "climate_last_23['number_of_counties_affected'] = climate_last_23[\n", - " 'disaster_number'].map(cl)" - ] - }, - { - "cell_type": "code", - "execution_count": 145, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
yearstatedisaster_typetotal_number_of_events
02000AKSevere Storm1
12000ALFire1
22000ALSevere Storm3
32000ARSevere Ice Storm2
42000AZSevere Storm1
\n", - "
" - ], - "text/plain": [ - " year state disaster_type total_number_of_events\n", - "0 2000 AK Severe Storm 1\n", - "1 2000 AL Fire 1\n", - "2 2000 AL Severe Storm 3\n", - "3 2000 AR Severe Ice Storm 2\n", - "4 2000 AZ Severe Storm 1" - ] - }, - "execution_count": 145, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#only keep one county row per disaster- since we just need to find the total number of events\n", - "climate_last_23_summary = climate_last_23.drop(columns=['dec_date','fiscal_year',\n", - " 'pa_program','begin_date'\n", - " , 'end_date', 'area_name',\n", - " 'full_county_code'])\n", - "climate_last_23_summary = climate_last_23_summary.drop_duplicates(\n", - " subset='disaster_number', keep=\"first\")\n", - "climate_last_23_summary = climate_last_23_summary.drop(columns=[\n", - " 'disaster_number','state_code', 'county_code','number_of_counties_affected'])\n", - "climate_last_23_summary= climate_last_23_summary[[\n", - " 'year','state','disaster_type']]\n", - "climate_last_23_summary\n", - "climate_last_23_summary.duplicated()\n", - "climate_last_23_summary= climate_last_23_summary.groupby(\n", - " climate_last_23_summary.columns.tolist(),as_index=False).size()\n", - "climate_last_23_summary.rename(columns = {\"size\": \"total_number_of_events\"}, \n", - " inplace = True)\n", - "climate_last_23_summary.head()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 146, - "metadata": {}, - "outputs": [], - "source": [ - "# Make sure you sort the time horizon column in ascending order because this \n", - "# column is in random order in the raw dataset\n", - "climate_last_23_summary=climate_last_23_summary.sort_values(\"year\") " - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Which disasters go on for a long time?" - ] - }, - { - "cell_type": "code", - "execution_count": 147, - "metadata": {}, - "outputs": [], - "source": [ - "climate_last_23['end_date']= pd.to_datetime(climate_last_23['end_date'])\n", - "climate_last_23['begin_date']= pd.to_datetime(climate_last_23['begin_date'])\n", - "\n", - "climate_last_23['length_of_disaster'] = (climate_last_23['end_date'] - \n", - " climate_last_23['begin_date']).dt.days" - ] - }, - { - "cell_type": "code", - "execution_count": 148, - "metadata": {}, - "outputs": [], - "source": [ - "climate_dict = {k: f.groupby('disaster_number')['year'].unique().apply(list).\n", - " to_dict()\n", - " for k, f in climate_last_23.groupby('disaster_type')}" - ] - }, - { - "cell_type": "code", - "execution_count": 149, - "metadata": {}, - "outputs": [], - "source": [ - "from climate_datasets import *" - ] - }, - { - "cell_type": "code", - "execution_count": 150, - "metadata": {}, - "outputs": [], - "source": [ - "cleaned_data = get_cleaned_data(\"disaster_declarations.csv\", True)" - ] - }, - { - "cell_type": "code", - "execution_count": 151, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 151, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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amqqkpOT1aFDB1WsWFFffPGF7r//ft1///1KS0vzKPf4449r8ODB2rhxo5o1a6ZOnTrpl19+kSTt379fLVu2VOPGjbV+/XotWrRIBw4cULdu3Ty2MW3aNJUvX16ff/65Jk6cmGc7zUxdunTRr7/+qhUrVmjJkiXatWuXbr/9dknS7bffro8//liStHbtWu3fv1/R0dF5bvPtt9/W8OHD9dxzz2n9+vWKjIzUuHHjPNY5evSoevXqpZUrV2rNmjWqXbu22rVrp6NHj0qS+vbtq0WLFmn//v3uMgsXLtSxY8fUrVs37d+/X3fccYf69OmjHTt2aPny5eratavMLM+2AReiVl635ToBpYXw4bCbb75ZjRs31vDhw4u8jbCwML344ouKj49Xnz59FB8fr4yMDD311FOqXbu2nnzySfn4+Ojzzz/3KDdgwADdcsstqlevnsaPH6/Q0FC99tprkqTx48friiuuUEpKiurWravLL79ckydP1rJly7Rz5073NmrVqqXRo0crPj5edevWzbOdH3/8sbZs2aKZM2fqyiuvVNOmTTV9+nStWLFC69atc48qSFKVKlUUERGhcuXK5bnNMWPGqE+fPurbt6/i4+P17LPPqn79+h7rXH/99brzzjtVr1491atXTxMnTlRGRoZWrFghSWrWrJni4+M1ffp0d5kpU6botttuU1BQkPbv36/Tp0+ra9euio2NVcOGDfXggw8qKCgonz0DACgIwkcpGDVqlKZNm6bt27cXqXxCQoLHl1qFh4e7T19IZ0dYKlWqpIMHD3qUu+aaa9z/L1++vJo0aaIdO3ZIkr788kstW7ZMQUFB7ikrXOzatctdrkmTJgVu544dOxQdHe0xmlG/fn1VqFDBXW9h7dixw+Nx/PlxSdLBgwd1//33q06dOgoNDVVoaKiOHTumffv2udfp27evpkyZ4l7/gw8+UJ8+fSRJjRo10g033KCGDRvqtttu06uvvnrRXKcDABcCwkcpaNGihW666SY99dRTHvO9vLyyDe3/8ccf2cp7e3t7/O1yuXKcl5mZmW9bsu60yczMVMeOHbVp0yaP6ZtvvlGLFi3c6wcGBua7zSxmluOdPLnNLym9e/fWl19+qTFjxmjVqlXatGmTKlWq5HGB7F133aXvvvtOq1ev1owZMxQbG6u//vWvks6GtyVLlujDDz9U/fr19dJL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qFJSUrRw4cI825ubMvE9H99//73ef//9HENAampqjmXi4+M1fvx4XX/99Vq9erVuuOEGjRkzRgsWLFD58uU1e/bsPOv87rvvdPPNN+urr76Sy+Vy/0Rw1o/d5fYEKc5BJktGRkaOjzUxMTHXMoXtoxdffFH33Xef/Pz8cvxUda68XvQrVqzQf/7zH4+g9fjjj+uvf/1rntv8szNnzuirr75STExMgT5tFKWPilN2w4YN8vb2VsOGDSVJ8+bN05QpU1S/fn0lJyfLx8cnx3JBQUHq1q2b+vTpU+RPCIWVmZmp5557ThMmTNCBAwe0c+dO1ahRQ//4xz8UGxub64H43PJFObhlKUhgL6nnX3EU9VN2UbRr105mpjfeeENhYWGSpF9++UV33nmnvLy89MEHH+RadteuXfrrX/+qJ554QgMHDtSxY8fUtm1bZWZmatGiRQoODs6xXP/+/bVs2TL961//0l133aWxY8fqhx9+0MSJEzVy5Ej16NGjRB9jcetMSkpSnTp1NH78eFWoUEGbN2+Wt7e37rzzTj388MPq2rVrrmWrVKmiZcuWqUGDBpo8ebLGjBmjDRs26O2339Zzzz2nbdu25VguKChIW7duVWxsrJKTk7V161a9++672rBhg9q1a5ftN8pKQnH6aM2aNerevbv27t2b7WfrXS5XnsHFy8srxx9rzeLt7a3bb79dEydO9PjAcvnll+uRRx7RXXfdpeDgYG3evFk1atTQpk2b1KZNm6L3Ub6/e1vKPv74YwsICLCEhAQrX768NW7c2CpUqGChoaF23XXX5VrO39/f9u7da2ZmQ4YMsZ49e5qZ2datW61y5cr51tuhQwfr3LmzHTx40IKCgmz79u22cuVKu/rqq+3TTz/NtVzbtm2tTZs29ssvv7jn/fzzz9amTRtr165dnnUePHjQ2rdvb15eXjlOuSlKH8XGxtrPP//s/n9uU1xcXK71Tp8+3cqXL2/dunWzF154wcaMGWPdunUzb29ve+ONN/J8rA8//LBNmjTJzMxOnz5tzZs3N5fLZYGBgbZs2bIS76Pilm3SpIm9++67Zma2a9cu8/PzszvuuMNq1aplDz/8cK7l3n//fevatav5+PhY7dq1bcSIEfbDDz/kWde50tLSbOzYsTZ06FB75JFHPKbcPP3001ajRg2bMWOG+fv7265du8zM7K233rK//OUveda3evVqi4uLMy8vL3O5XB5Tfn20a9cuS0xMdK97brk/ly3O8+/mm2+2w4cPu/+f15SbDRs2WEREhIWEhFi5cuWsSpUq7udfXs/5LGvXrrXHH3/cbr/99gLVGRAQYFu2bMk2f9OmTRYYGJhvfZs2bbKwsDB7+eWXrVmzZnbttdfa0aNH8ywTHR3tfi0FBwfbN998Y2Zmr7/+urVt2zbfOs0K//wrTp2hoaH2v//9z/3/7du3m5nZmjVrLD4+Ps+yfn5+tm/fPjMzu/322+2f//ynmZnt3bvXAgICci1XsWJF27Ztm5mZNW/e3CZOnGhmZrt37zZ/f/886zQzS09PtzvvvNMiIyOtXLlyBTqmFKePGjVqZLfddptt377dDh06ZL/99pvHlJe5c+dafHy8TZo0ybZs2WKbN2+2SZMmWb169WzWrFk2Y8YMq169ug0ePNijnL+/v+3evdvMzIKCgtzHk127dpmvr29+XZSrCz58XHXVVfaPf/zDzP7/gR89etQ6depk48aNy7VclSpVbMOGDWZm1rhxY5s2bZqZmX377bcFerFXqlTJNm/ebGZmISEh7hfFJ598Yo0bN861XHEOMt27d7dmzZrZ2rVrLTAw0BYvXmzTp0+3+Ph4W7BgQa7litpHxVW3bl1LTU3NNv/555+3unXr5lm2WrVqtm7dOjMzmzNnjkVFRdnXX39tw4YNs2bNmuVarqh9VNyyISEh9u2335qZ2ciRI61169ZmZvbZZ59Z9erV8yxrdjaApqamWmJiopUvX97at29v7733nv3xxx+5lilq8K5Zs6Z9/PHHZuZ5sNixY4dVqFAhz3YW5+BW1MBeWL1797YjR464/5/XlJuWLVvavffea6dPn3b30b59+6xFixb23nvv5Vn/m2++ad7e3ta+fXvz8fGxDh06WHx8vIWGhuZaZ8WKFe3zzz/PNv+zzz6zihUrFuhxf/bZZxYQEGAtW7a048eP57t+YGCg7dmzx8zOvt6++OILMzP77rvvCnQMLMrzrzh1Vq5c2b7++mszM6tTp44tWrTIzM4+b/MLAgkJCTZ+/Hg7cOCAVahQwT777DMzM/vyyy+tatWquZbr2LGj3XTTTfavf/3LvL297fvvvzczs48++shq166dZ51mZm3atLH69evbuHHjbM6cOTZ37lyPKSfF6aOAgAB3WCmsq666yt2n51q0aJFdddVVZnb2WFyjRg2P5TVq1LAlS5aYmefxZNq0aVavXr0itcWsDISPoKAg90G/QoUKtnXrVjM7+2YeExOTa7nu3bvbFVdcYffcc48FBAS4P2XNmzfPEhIS8q23QoUK7k6uUaOGLV261MzOhpe8XgjFOchERES4n4jBwcHuF+K8efOsefPmuZYrah8Vl4+PT44vhG+++SbfROzr62tpaWlmZnbvvfe6Rw++++47Cw4OzrVcUfuouGWDg4Nt586dZmZ244032pgxY8zs7CcrPz+/PMv+2Ysvvmi+vr7mcrmsSpUq9o9//CPHN5Oihko/Pz/3we3cg8W2bdvO68GtqIH9XJmZmZaZmVngdffs2VOgN+I/K86n7IYNG9rLL79sZv/fv5mZmXbvvfe6P3H/Wc+ePS0hIcHWrFnjfoyrV6+2Bg0aWK9evbKt36RJE7vqqquyTZUqVbKEhASPeXm1c/ny5WZm1qpVK/cn2hdeeMGqVauWdwdZ0Z5/xamzVatW7hHTfv362dVXX20zZsywm266ya6++uo8y86cOdPKly9v5cqVs5YtW7rnjxo1yv1BISd79+619u3bW2Jionsk1sxs0KBB9tBDD+VZp9nZftm4cWO+652rOH103XXX2Ycfflio+rL4+fnZjh07ss3fsWOH+xiW04jPqFGjrH79+rZmzRoLDg62lStX2owZM6xKlSr20ksvFaktZmUgfISHh7uHxerXr2/z5s0zs/xHEg4dOmT9+/e3Tp06eeysf/7zn/bss8/mW++1115rc+bMMTOzO+64w9q0aWOfffaZ3XXXXXmGl8IeZM4VHBzsHt6KiYlxp/fvvvsuz8BTlD565JFH7NixY+7/5zXlpmbNmjZhwoRs8ydMmGC1atXK87Fedtll9tFHH9np06ctOjra5s+fb2ZnT4vl9em8qH1U3LLXXXed3XXXXfb666+bt7e3+w16+fLlBQp4+/fvt1GjRlndunUtICDAevToYUuXLrUZM2ZYgwYNrFWrVtnKFDVUXnnllTZ9+nT3NrLCR3Jysl177bX5Ps6iHtyKGtjNzCZNmmQJCQnm4+NjPj4+lpCQYK+++mqeZc6cOWPe3t7uUFgYxfmUHRAQ4H4eVapUyT3SuX37douIiMixzKFDh6xTp07mcrncj9HLy8u6dOmS44jS3//+9wJPuUlNTbUXXnjBzMyWLl1q/v7+7nqzwnNeivL8K06d69atcz9nDh48aG3btrXg4GC7/PLLC/QGv3fvXlu1apXHaOLKlSvtq6++yrdsUdWrV889wl5Qxemj2bNnW/369W3KlCm2fv1627x5s8eUl8aNG1uvXr3s5MmT7nmnTp2yXr16uT8cfPbZZxYbG5ut7FNPPWX+/v7uU6l+fn55PvcK4oIPH507d7ZXXnnFzMwef/xxq1Wrlj377LN2xRVX2A033HDe6l20aJF7+HXXrl1Wr149c7lcVrlyZfvkk09yLVfYg8y5mjRp4j4Idu7c2Xr27Gnff/+9DRkyJNtQ2LmK0kdJSUl26NAh9/9zm/Ia3h83bpz5+PjY/fffb6+//rpNnz7d+vXrZ76+vjmGknMNHz7cQkNDrW7dunbZZZfZiRMnzMzstddey/O6hKL2UXHLbt682Ro0aGAhISGW0373/wAAIABJREFUnJzsnj9gwAC74447ci333nvvWYcOHczb29saNWpkL730krvfs2zdutW8vb2zlS1q8H7//fctNDTURo4caQEBAfbvf//b+vbtaz4+PrZ48eI8H2dxDm5FDex///vfLTAw0J544gmbN2+ezZs3z5544gkLCgqyYcOG5Vln/fr1bfXq1Xmuk5PifMquXr26O3AkJibazJkzzcxs1apVFhISkmfZb775xt5//32bN29egUaYTp8+bZ999pn9+uuvBXlYedq7d6+99957tmnTpgKtX9TnX3HqdMLhw4cLPOXno48+statW7vDaFEUpo/+fB3WuddX5XdN1ueff26VKlWyKlWq2A033GA33nijVa1a1SpVquR+Db3++us2evToHMsfP37c1q1bZ1988UW+1xsVxAUfPnbt2uU+6B0/ftweeOABa9iwod18883uoeW8HD9+3Hbs2FGog2hufvnllwIPCe/cubNQBxkzsxkzZtiUKVPM7OwFcVWqVDEvLy/z8/OzWbNm5VquuH1UHLNnz7bmzZtbWFiYhYWFWfPmzXM91/ln77zzjqWmprpPv5iZTZ06Nc/yRe2j4pbNze+//26nTp3KdXlISIjdd999tnbt2lzXycjI8Ag0WYoTvBctWmQtWrSwwMBA+z/23jssivPr/38vvUgHCyoioigIohI0oBQL9gKJoqhUYxckRNREjdg1il1RFLErmiixgwUExRBUUFSE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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "days_in_disaster = number_of_days_in_dec_disaster(cleaned_data)\n", - "data= pd.Series(days_in_disaster).to_frame('Number_of_days').reset_index()\n", - "##data = pd.DataFrame(days_in_disaster, index= [0])\n", - "#data\n", - "data_subset = data.loc[(data['Number_of_days'] >= 12)]\n", - "data_subset.plot(kind='bar', x='index', \n", - " title = 'States >=12 days in disaster state per year', \n", - " colormap = 'viridis')" - ] - }, - { - "cell_type": "code", - "execution_count": 152, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
disaster_typeyeartotal_number_of_events
96Other20002
104Severe Ice Storm20003
120Severe Storm200034
48Flood20002
143Snowstorm20002
\n", - "
" - ], - "text/plain": [ - " disaster_type year total_number_of_events\n", - "96 Other 2000 2\n", - "104 Severe Ice Storm 2000 3\n", - "120 Severe Storm 2000 34\n", - "48 Flood 2000 2\n", - "143 Snowstorm 2000 2" - ] - }, - "execution_count": 152, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = change_in_frequency(number_of_disaster_events_by_state(cleaned_data))\n", - "t.columns\n", - "t.head()\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Getting the population figures, and seeing what cleaning is needed. " - ] - }, - { - "cell_type": "code", - "execution_count": 153, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
state2010201120122013201420152016201720182019
8Alabama4,785,4374,799,0694,815,5884,830,0814,841,7994,852,3474,863,5254,874,4864,887,6814,903,185
9Alaska713,910722,128730,443737,068736,283737,498741,456739,700735,139731,545
10Arizona6,407,1726,472,6436,554,9786,632,7646,730,4136,829,6766,941,0727,044,0087,158,0247,278,717
11Arkansas2,921,9642,940,6672,952,1642,959,4002,967,3922,978,0482,989,9183,001,3453,009,7333,017,804
12California37,319,50237,638,36937,948,80038,260,78738,596,97238,918,04539,167,11739,358,49739,461,58839,512,223
\n", - "
" - ], - "text/plain": [ - " state 2010 2011 2012 2013 2014 \\\n", - "8 Alabama 4,785,437 4,799,069 4,815,588 4,830,081 4,841,799 \n", - "9 Alaska 713,910 722,128 730,443 737,068 736,283 \n", - "10 Arizona 6,407,172 6,472,643 6,554,978 6,632,764 6,730,413 \n", - "11 Arkansas 2,921,964 2,940,667 2,952,164 2,959,400 2,967,392 \n", - "12 California 37,319,502 37,638,369 37,948,800 38,260,787 38,596,972 \n", - "\n", - " 2015 2016 2017 2018 2019 \n", - "8 4,852,347 4,863,525 4,874,486 4,887,681 4,903,185 \n", - "9 737,498 741,456 739,700 735,139 731,545 \n", - "10 6,829,676 6,941,072 7,044,008 7,158,024 7,278,717 \n", - "11 2,978,048 2,989,918 3,001,345 3,009,733 3,017,804 \n", - "12 38,918,045 39,167,117 39,358,497 39,461,588 39,512,223 " - ] - }, - "execution_count": 153, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pop_2010_2019 = pd.read_csv(\"state_pop_2010_2019.csv\")\n", - "pop_2010_2019.dropna(axis=0,inplace= True)\n", - "pop_2010_2019.drop(columns=pop_2010_2019.columns[1:3], axis=1, inplace=True)\n", - "name_list = ['state'] + list(range(2010,2020))\n", - "name_list = [str(i) for i in name_list]\n", - "pop_2010_2019.columns = name_list\n", - "pop_2010_2019[\"state\"]= pop_2010_2019[\"state\"].str.replace(\".\",\"\", regex= True)\n", - "state_names = get_state_names('Census_State_codes.txt')\n", - "state_name_list = state_names.state_name.values.tolist()\n", - "pop_2010_2019 = pop_2010_2019.loc[pop_2010_2019['state']\n", - " .isin(state_name_list)]\n", - "pop_2010_2019.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 154, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
state202020212022
3United States331,511,512332,031,554333,287,557
8Alabama5,031,3625,049,8465,074,296
9Alaska732,923734,182733,583
10Arizona7,179,9437,264,8777,359,197
11Arkansas3,014,1953,028,1223,045,637
\n", - "
" - ], - "text/plain": [ - " state 2020 2021 2022\n", - "3 United States 331,511,512 332,031,554 333,287,557\n", - "8 Alabama 5,031,362 5,049,846 5,074,296\n", - "9 Alaska 732,923 734,182 733,583\n", - "10 Arizona 7,179,943 7,264,877 7,359,197\n", - "11 Arkansas 3,014,195 3,028,122 3,045,637" - ] - }, - "execution_count": 154, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pop_2020_2022 = pd.read_csv(\"state_pop_2020_2022.csv\")\n", - "pop_2020_2022.dropna(axis=0,inplace= True)\n", - "pop_2020_2022\n", - "pop_2020_2022.drop(columns=pop_2020_2022.columns[1], axis=1, inplace=True)\n", - "name_list = ['state'] + list(range(2020,2023))\n", - "name_list = [str(i) for i in name_list]\n", - "pop_2020_2022.columns = name_list\n", - "pop_2020_2022[\"state\"]=pop_2020_2022[\"state\"].str.replace(\".\",\"\", regex= True)\n", - "state_names = get_state_names('Census_State_codes.txt')\n", - "state_name_list = state_names.state_name.values.tolist()\n", - "state_name_list.append(\"United States\")\n", - "pop_2020_2022 = pop_2020_2022.loc[pop_2020_2022['state']\n", - " .isin(state_name_list)]\n", - "pop_2020_2022.head()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.10" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/snowlm/EDA/climate_eda.py b/snowlm/EDA/climate_eda.py new file mode 100644 index 0000000..23ec6f2 --- /dev/null +++ b/snowlm/EDA/climate_eda.py @@ -0,0 +1,100 @@ +''' +Severe Climate Events: Disaster Declaration for states and counties +Exploratory Data Analysis by @Harsh Vardhan Pachisia +''' +import pandas as pd +pd.options.mode.chained_assignment = None + +disasters_raw = pd.read_csv("snowlm/data/disaster_declarations.csv") + +##Understanding the raw data +disasters_raw.head() +disasters_raw.info() + +# keeping only the possibly relevant columns +disasters = disasters_raw[[ + 'id','disasterNumber', 'state','fipsStateCode','fipsCountyCode','placeCode', + 'declarationDate','fyDeclared','incidentType', 'ihProgramDeclared', + 'iaProgramDeclared','paProgramDeclared','hmProgramDeclared', + 'incidentBeginDate','incidentEndDate','designatedArea']] + +#Understanding the type of disasters present +disasters.incidentType.describe() +disasters.incidentType.value_counts() + +##Two points of note: +#1. There are non-natural disasters in this data that need to be removed +# including: 'Biological','Toxic Substances','Chemical','Terrorist', +# 'Human Cause','Fishing Losses'. +#2. 'Severe Storms' and 'Severe Storm(s)' are repeated, needs to be checked. + +disasters.loc[disasters["incidentType"] == "Severe Storms(s)"] +# only 3 severe storms(s) (based on disaster numbers). +# check if they overlap with 'Severe Storm'. +disasters.loc[disasters["disasterNumber"] == 4670] +disasters.loc[disasters["disasterNumber"] == 4664] +disasters.loc[disasters["disasterNumber"] == 4672] +# each severe storms(s) overlaps with 'Severe Storm' +# can be removed from the dataset to avoid duplication. + +#Calculating the number of disasters by incident type and +# removing the ones that are not climate disasters. +disaster_type_list = disasters.incidentType.unique().tolist() +disaster_type_list +#removing severe storm(s) since they are only 3 which are +# statewide emergencies that are already covered by severe storm- duplicates +unwanted_disasters = ['Biological','Toxic Substances','Chemical','Terrorist', + 'Human Cause','Fishing Losses', 'Severe Storm(s)'] +climate_disasters_list = [ele for ele in disaster_type_list + if ele not in unwanted_disasters] +climate_disasters = disasters.loc[ + disasters['incidentType'].isin(climate_disasters_list)] + +#Checking for state-wide disasters that can be removed +# if they are already covered by a county, to ensure that county codes of 0 +# are not kept in the dataset. +state_wide_disasters = disasters.loc[disasters["designatedArea"] == "Statewide"] + +#### Subsetting the data to the last 23 years (2000-2022). +climate_disasters["declarationDate"] = pd.to_datetime( + climate_disasters["declarationDate"]) +# adding a year column +climate_disasters['Year'] = climate_disasters[ + 'declarationDate'].dt.strftime('%Y') + +# subsetting the data +climate_last_23 = climate_disasters.loc[(climate_disasters['Year'] >= '2000') + & (climate_disasters['Year'] <= '2023')] +climate_last_23.head() + +#If we take all years- we have 52,445 counties that have been affected +# by climate-related disasters. +# If we take from 2000 onwards (2000-2022 included), +# we get 36,340 counties that have been affected by climate-related disasters. + +#Renaming climate columns +climate_last_23.columns = ['record_id', 'disaster_number', 'state', 'state_code', + 'county_code','place_code','dec_date', 'fiscal_year', + 'disaster_type','ih_program','ia_program', 'pa_program', + 'hm_progam','begin_date', 'end_date', 'area_name', + 'year'] +climate_last_23.drop(columns=['record_id'], inplace= True) + +### Deciding on economic assistance program to analyze. +total_number_of_counties_affected = climate_last_23.shape[0] +climate_last_23.hm_progam.value_counts()/total_number_of_counties_affected +climate_last_23.ih_program.value_counts()/total_number_of_counties_affected +climate_last_23.ia_program.value_counts()/total_number_of_counties_affected +climate_last_23.pa_program.value_counts()/total_number_of_counties_affected + +#Hazard Mitigation declared: 61.34% +#Individual and Households: 81.71% +#Individual Assistance: 86.46% +#Public Assistance: 94.13% + +#Keeping only Public assistance column as it has the highest coverage +# in our dataset, is the largest program under FEMA, and hence, +# has the largest economic impact. + +climate_last_23 = climate_last_23.drop(columns=[ + 'ih_program','ia_program','hm_progam']) \ No newline at end of file diff --git a/snowlm/EDA/public_assistance_eda b/snowlm/EDA/public_assistance_eda index 773d110..32299a2 100644 --- a/snowlm/EDA/public_assistance_eda +++ b/snowlm/EDA/public_assistance_eda @@ -14,4 +14,19 @@ pivoted.sum(axis='columns') #returns total by state print(pivoted) +## code for checking merge with disastr IDS + +len(project_summaries['disasterNumber'].unique()) #1544 +len(set(disaster_list)) ##2758, harsh has a longer time frame, and many + #disasters dont have public assistance +len(project_summaries['disasterNumber'].unique()) #1374 + +## Duplicate removal code + # Drop duplicate observations + # Duplicate observations appear for "snow" vs "snowstorm" disaster types, + # and "storm vs storm (s) disaster types + project_summaries.drop_duplicates(subset = ['disasterNumber', 'declarationDate', + 'county', 'applicantName', 'educationApplicant', 'numberOfProjects', + 'fed_amount'], keep = 'first', inplace = True) + ################################################################################ diff --git a/snowlm/__main__.py b/snowlm/__main__.py index 8b13789..a08726d 100644 --- a/snowlm/__main__.py +++ b/snowlm/__main__.py @@ -1 +1,4 @@ +from snowlm import app +if __name__=='__main__': + app.run() diff --git a/snowlm/app.py b/snowlm/app.py new file mode 100644 index 0000000..3f4975d --- /dev/null +++ b/snowlm/app.py @@ -0,0 +1,5 @@ +import sys +from snowlm.data_viz import final_viz + +def run(): + final_viz.climate_viz() \ No newline at end of file diff --git a/snowlm/data_analysis/__init__.py b/snowlm/data_analysis/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/snowlm/data_analysis/__init__.py @@ -0,0 +1 @@ + diff --git a/snowlm/data_analysis/climate.py b/snowlm/data_analysis/climate.py index 4c48c77..f07875f 100644 --- a/snowlm/data_analysis/climate.py +++ b/snowlm/data_analysis/climate.py @@ -1,7 +1,8 @@ ''' CAPP 30122 -Team: Snow Laughing Matter -Author: Harsh Vardhan Pachisia +@Team: Snow Laughing Matter +@Author: Harsh Vardhan Pachisia + Code for cleaning and analyzing the climate datasets from FEMA and writing functions to obtain final datasets for each visual. ''' @@ -9,7 +10,7 @@ pd.options.mode.chained_assignment = None import numpy as np -def get_cleaned_data(raw_data_path, only_2000_onwards): +def get_cleaned_data(raw_data_path,only_2000_onwards): ''' Takes in raw data filepath and a boolean to choose only last 20 years of data or data since 1980 and outputs the clean climate related disasters @@ -39,7 +40,7 @@ def get_cleaned_data(raw_data_path, only_2000_onwards): disaster_type_list = disasters.disaster_type.unique().tolist() #removing non-climate related disasters or climate disasters that are - #repeated (check Jupyter Notebook for further details) + #repeated (check climate_eda.py for further details) unwanted_disasters = ['Biological','Toxic Substances','Chemical', 'Terrorist','Human Cause','Fishing Losses', 'Severe Storm(s)'] @@ -66,11 +67,11 @@ def get_cleaned_data(raw_data_path, only_2000_onwards): #remove records that have 0's in the county code- they are ones that are # state-wide disasters and are already covered by other rows. climate_cleaned.drop(climate_cleaned[ - climate_cleaned['county_code'] == 0].index,inplace = True) + climate_cleaned['county_code'] == 0].index,inplace=True) # add state name for readability state_names = get_state_names("snowlm/data/Census_State_codes.txt") - climate_data = climate_cleaned.merge(state_names, how='left', on = ['state']) + climate_data = climate_cleaned.merge(state_names,how='left',on=['state']) return climate_data @@ -86,8 +87,7 @@ def get_state_names(raw_file_path): state_names: A pandas dataframe of state codes and state names. ''' state_code_lookup_raw = pd.read_csv(raw_file_path,sep='|') - state_code_lookup_raw.drop(columns=['STATE', - 'STATENS'], inplace=True) + state_code_lookup_raw.drop(columns=['STATE','STATENS'],inplace=True) state_names = state_code_lookup_raw.rename( columns={"STATE_NAME": "state_name", "STUSAB": "state"}) @@ -174,7 +174,7 @@ def type_of_disasters_by_state(climate_summary): climate_top_5 (pandas dataframe): Sum of each disaster type by each state, limited to the top 5. ''' - climate_grouped_by_disasters = climate_summary.groupby( + climate_grouped_by_disasters = climate_summary.groupby( ['state', 'disaster_type'], as_index = False)[ 'total_number_of_events'].sum() climate_top_5 = climate_grouped_by_disasters.sort_values([ @@ -271,7 +271,7 @@ def number_of_days_in_dec_disaster(climate_df): climate_grouped_by_state['length_of_disaster'], decimals = 1) # a dict with states as keys and values as the average length of disaster - climate_dict= dict(zip(climate_grouped_by_state.state, + climate_dict = dict(zip(climate_grouped_by_state.state, climate_grouped_by_state.length_of_disaster)) # add the national average @@ -319,7 +319,7 @@ def get_pop_across_years(raw_data_path,period_start,period_end): pop_period['state_name'] = pop_period["state_name" ].str.replace(".","",regex= True) - # get the state names and matching + # get the state names and match state_names = get_state_names("snowlm/data/Census_State_codes.txt") state_name_list = state_names.state_name.values.tolist() pop_period = pop_period.loc[pop_period['state_name'] @@ -345,7 +345,7 @@ def get_all_pop(): 2020,2022) #merging all periods together - all_pop= pop_2000_2009.merge(pop_2010_2019, how='left', on='state_name') - all_pop = all_pop.merge(pop_2020_2022, how='left', on='state_name') + all_pop = pop_2000_2009.merge(pop_2010_2019,how='left',on='state_name') + all_pop = all_pop.merge(pop_2020_2022,how='left',on='state_name') return all_pop \ No newline at end of file diff --git a/snowlm/data_analysis/climate_econ_pop.py b/snowlm/data_analysis/climate_econ_pop.py index 8f8da5a..5189acb 100644 --- a/snowlm/data_analysis/climate_econ_pop.py +++ b/snowlm/data_analysis/climate_econ_pop.py @@ -1,17 +1,17 @@ ''' CAPP 30122 -Team: Snow Laughing Matter -Author: Harsh Vardhan Pachisia +@Team: Snow Laughing Matter +@Author: Harsh Vardhan Pachisia Code for getting final datasets for visuals: -1. combined climate and economic data +1. Combined climate and economic data 2. Combined climate, economic and population of state data ''' import pandas as pd pd.options.mode.chained_assignment = None -import numpy as np from snowlm.data_analysis.economic_impact import ( - clean_disaster_summaries) -from snowlm.data_analysis.climate import * + clean_disaster_summaries, aggregate_public_assistance) +from snowlm.data_analysis.climate import (number_of_disaster_events_by_state, + get_cleaned_data,get_all_pop) def get_climate_econ_data(only_2000_onwards): ''' @@ -28,16 +28,17 @@ def get_climate_econ_data(only_2000_onwards): climate_econ_data: A pandas dataframe that provided climate and economic data. ''' - FEMA_obli_by_yr_state_disastertype = clean_disaster_summaries( + FEMA_obli_by_yr_state_disastertype = aggregate_public_assistance( + clean_disaster_summaries( "snowlm/data/PublicAssistanceFundedProjectsSummaries.csv", - "snowlm/data/disaster_declarations.csv") + "snowlm/data/disaster_declarations.csv")) if only_2000_onwards: disaster_events_by_state = number_of_disaster_events_by_state( - get_cleaned_data("snowlm/data/disaster_declarations.csv", True)) + get_cleaned_data("snowlm/data/disaster_declarations.csv",True)) else: disaster_events_by_state = number_of_disaster_events_by_state( - get_cleaned_data("snowlm/data/disaster_declarations.csv", False)) + get_cleaned_data("snowlm/data/disaster_declarations.csv",False)) climate_econ_data = disaster_events_by_state.merge( FEMA_obli_by_yr_state_disastertype, how='left', @@ -69,7 +70,7 @@ def get_climate_econ_pop_data(): pop_of_state_for_that_year = 0 if not pop_of_state_over_years.empty: - pop_of_state_for_that_year= pop_of_state_over_years[year].iloc[0] + pop_of_state_for_that_year = pop_of_state_over_years[year].iloc[0] climate_econ_pop.at[index,'state_pop'] = pop_of_state_for_that_year climate_econ_pop['state_pop'] = climate_econ_pop['state_pop' diff --git a/snowlm/data_analysis/economic_impact.py b/snowlm/data_analysis/economic_impact.py index c120c3f..784bb59 100644 --- a/snowlm/data_analysis/economic_impact.py +++ b/snowlm/data_analysis/economic_impact.py @@ -1,29 +1,39 @@ +''' +CAPP 30122 +Team: Snow Laughing Matter +Author: Jackie Glasheen + +Code for cleaning and analyzing FEMA public assistance for climate-related +disasters. + +Web page for CSV download: +https://www.fema.gov/openfema-data-page/public-assistance-funded-project-summaries-v1 +''' + import pandas as pd from snowlm.data_analysis.climate import (get_cleaned_data, - list_of_disaster_numbers) + list_of_disaster_numbers) + def clean_disaster_summaries(filepath_public_assistance, filepath_disasters): ''' Clean the Public Assistance Funded Project Summaries raw CSV file. - Raw file downloaded from FEMA - + Raw file downloaded from FEMA website. + Inputs: filepath_public_assistance (str): filepath to raw public assistance data filepath_disasters (str): filepath to raw disaster data - Output (pandas df) data frame with the total FEMA public assistance federal - obligations by year and state. + + Output (pandas df) data frame with cleaned FEMA federal obligations data ''' project_summaries = pd.read_csv(filepath_public_assistance) - # Limit dataset to the subsetted disasters (see assumptions in climate_datasets.py) + # Limit dataset to the subsetted disasters (see assumptions in + # climate_datasets.py) disaster_list = list_of_disaster_numbers(get_cleaned_data(filepath_disasters, True)) project_summaries = project_summaries[project_summaries.isin({"disasterNumber": disaster_list}).any(axis=1)] - - # Clean raw data - project_summaries = project_summaries.drop(columns=['disasterNumber', - 'numberOfProjects', 'educationApplicant']) # Make a year variable project_summaries["year"] = project_summaries["declarationDate"].str[:4] @@ -39,19 +49,24 @@ def clean_disaster_summaries(filepath_public_assistance, filepath_disasters): project_summaries, state_code_lookup_raw, how='left', on = 'state') project_summaries = project_summaries.drop(columns=['state']) - - # Aggregate federal oblications by state year, and disaster type - project_summaries = project_summaries.groupby(['state_code', - 'incidentType', "year"], as_index=False).sum('federalObligatedAmount') - project_summaries.rename(columns = {"state_code": "state", - "federalObligatedAmount": "fed_amount", "incidentType": "disaster_type"}, + project_summaries.rename(columns = {"state_code": "state", + "federalObligatedAmount": "fed_amount", "incidentType": "disaster_type"}, inplace = True) - + return project_summaries -def aggregate_public_assistance(public_assistance_df_file): + +def aggregate_public_assistance(public_assistance_df_file): """ + Aggregate FEMA federal obligations by state, year, and disaster type + + Input: + public_assistance_df_file (df) cleaned FEMA federal obligations data + + Output (df) pandas df with the total FEMA public assistance federal + obligations by year, state, and disaster type. """ + project_summaries = public_assistance_df_file.drop(columns=['disasterNumber', 'numberOfProjects', 'educationApplicant']) @@ -61,15 +76,24 @@ def aggregate_public_assistance(public_assistance_df_file): return collapsed_summaries -def top_5_by_public_assistance(public_assistance_df_file): + +def top_5_by_public_assistance(public_assistance_df_file): """ + Aggregate FEMA federal obligations by disaster number and show the top 5 + events by state + + Input: + public_assistance_df_file (df) cleaned FEMA federal obligations data + + Output (df) pandas df with top 5 events by state """ + project_summaries = public_assistance_df_file.drop(columns = ['numberOfProjects', 'educationApplicant']) - collapsed_summaries = project_summaries.groupby(['disasterNumber','state', + collapsed_summaries = project_summaries.groupby(['disasterNumber','state', 'disaster_type', "year"], as_index = False).sum('fed_amount') - collapsed_summaries = collapsed_summaries.sort_values(['state','fed_amount'], + collapsed_summaries = collapsed_summaries.sort_values(['state','fed_amount'], ascending = [True, False]).groupby('state').head(5) - return collapsed_summaries \ No newline at end of file + return collapsed_summaries diff --git a/snowlm/data_viz/.gitkeep b/snowlm/data_viz/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/snowlm/data_viz/.gitkeep @@ -0,0 +1 @@ + diff --git a/snowlm/data_viz/__init__.py b/snowlm/data_viz/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/snowlm/data_viz/__init__.py @@ -0,0 +1 @@ + diff --git a/snowlm/data_viz/final_viz.py b/snowlm/data_viz/final_viz.py new file mode 100644 index 0000000..9b2318b --- /dev/null +++ b/snowlm/data_viz/final_viz.py @@ -0,0 +1,772 @@ +""" +CAPP 30122 +Team: Snow Laughing Matter +Author: Shwetha Srinivasan + +Code for developing visualizations and final dashboard after data cleaning. + +Sources: +https://medium.com/codex/charting-with-plotly-dash-1bc9e25cbd5b +https://towardsdatascience.com/dash-for-beginners-create-interactive-python-dashboards-338bfcb6ffa4 +https://towardsdatascience.com/creating-an-interactive-dashboard-with-dash-plotly-using-crime-data-a217da841df3 + +The above mentioned sources have been generally useful as a guide to develop the interactive +dashboard and visualizations for this project. +""" +import dash +import dash_bootstrap_components as dbc +from dash import Dash, html, dcc, dash_table +from dash.dependencies import Input, Output +import plotly.express as px +import pandas as pd + +# Importing cleaned datasets from other files +from snowlm.data_analysis.climate import ( + get_cleaned_data, + number_of_disaster_events_by_state, + number_of_days_in_dec_disaster, + type_of_disasters_by_state, +) +from snowlm.data_analysis.economic_impact import ( + clean_disaster_summaries, + top_5_by_public_assistance, +) +from snowlm.data_analysis.climate_econ_pop import ( + get_climate_econ_pop_data, + get_climate_econ_data, +) +from snowlm.scrape_api.census_api_query import api_query +from snowlm.scrape_api.voting_record import scrape_voting_behavior + + +def climate_viz(): + dbc_css = ( + "https://cdn.jsdelivr.net/gh/AnnMarieW/dash-bootstrap-templates/dbc.min.css" + ) + app = dash.Dash(__name__, external_stylesheets=[dbc.themes.SPACELAB, dbc_css]) + + ########### Screen 1: National Figures ################ + climate_df = get_cleaned_data( + "snowlm/data/disaster_declarations.csv", only_2000_onwards=False + ) + climate_summary = number_of_disaster_events_by_state(climate_df) + + df_climate_summary = ( + climate_summary.groupby(["year", "disaster_type"])["total_number_of_events"] + .sum() + .reset_index() + ) + fig1 = px.bar( + data_frame=df_climate_summary, + x="total_number_of_events", + y="year", + color="disaster_type", + title="Total Number of Disaster Events from 1980 by State", + ) + fig1.update_yaxes(title_text="Year", categoryorder="category descending") + fig1.update_xaxes(title_text="Total Number of Disaster Events") + fig1.update_layout(legend_title="Disaster Types", title_x=0.5) + + ########### Screen 2: State Maps ################### + + df = get_climate_econ_data(only_2000_onwards=True) + df1 = ( + df.groupby(["year", "state", "state_name"])["total_number_of_events"] + .sum() + .reset_index() + ) + df2 = df.groupby(["year", "state", "state_name"])["fed_amount"].sum().reset_index() + + # Dropdown Menu for Map + + dropdown_options = [ + {"label": "Total Number of Disaster Events", "value": "map1"}, + {"label": "Total FEMA Public Assistance Funding", "value": "map2"}, + ] + dropdown = html.Div( + [ + dbc.Label("Select a variable"), + dcc.Dropdown( + id="dropdown", + options=dropdown_options, + value="map1", + ), + ], + className="mb-4", + ) + + # Displays and updates map based on the variable selected from the dropdown menu + + @app.callback( + Output("choropleth-map", "figure"), + Input("dropdown", "value"), + ) + def update_choropleth_map(selected_map): + if selected_map == "map1": + fig2 = px.choropleth( + df1, + locations="state", + color="total_number_of_events", + scope="usa", + locationmode="USA-states", + animation_frame="year", + color_continuous_scale=px.colors.sequential.OrRd, + height=650, + title="Map with Number of Disasters from 2000-2022", + ) + fig2.update_layout( + coloraxis_colorbar_title="Number of Disasters", title_x=0.5 + ) + else: + fig2 = px.choropleth( + df2, + locations="state", + color="fed_amount", + scope="usa", + locationmode="USA-states", + animation_frame="year", + color_continuous_scale=px.colors.sequential.matter, + height=650, + title="Map with FEMA Public Assistance from 2000-2022", + ) + fig2.update_layout(coloraxis_colorbar_title="FEMA Funding", title_x=0.5) + + return fig2 + + ########## Screen 2: Bubble Graph (Scatterplot) ########## + + df_pop = get_climate_econ_pop_data() + + data = ( + df_pop.groupby(["state", "year", "state_pop"]) + .agg({"total_number_of_events": "sum", "fed_amount": "sum"}) + .reset_index() + ) + data = data.sort_values("year", ascending=True) + + fig3 = px.scatter( + data, + x="total_number_of_events", + y="fed_amount", + size="state_pop", + animation_frame="year", + color="state", + hover_name="state", + title="Relationship between Disasters and Funding Received by Size of State Over Time", + ) + fig3.update_layout(title_x=0.5) + fig3.update_xaxes(title_text="Number of Disasters") + fig3.update_yaxes(title_text="FEMA Funding") + + ########### Screen 3: State and Census Level Information ########### + + # ########### Tables for Top 5 disaster types per state ############# + + # Top 5 Disasters Table + disaster_events = type_of_disasters_by_state(climate_summary) + top_disasters = disaster_events.sort_values(by='total_number_of_events', ascending=False).head(5) + table = dash_table.DataTable( + id='table', + columns=[{'name': col, 'id': col} for col in top_disasters.columns], + data=top_disasters.to_dict('records'),) + + # Top 5 Federal Assistance Table + df_econ_impact = clean_disaster_summaries( + "snowlm/data/PublicAssistanceFundedProjectsSummaries.csv", + "snowlm/data/disaster_declarations.csv") + top_funding = top_5_by_public_assistance(df_econ_impact) + top_funding = top_funding.drop(['disasterNumber'], axis=1) + top_funding['fed_amount'] = top_funding['fed_amount'].astype(int) + top_5_funding = top_funding.sort_values(by='fed_amount', ascending=False).head(5) + + funding_table = dash_table.DataTable( + id='funding-table', + columns=[{'name': col, 'id': col} for col in top_5_funding.columns], + data=top_5_funding.to_dict('records'),) + + + # Function for calculating top 10 worst counties for an indicator + + def get_top_10_counties(df, state, col_name, col_name_state, col_name_us, bool_val): + """ + Returns the top 10 worst counties for a specific census indicator + Inputs: + df (DataFrame): a census dataset + state (str): state selected when interacting with the map + col_name (str): column corresponding to county value for + chosen indicator + col_name_state (str): column corresponding to state value for chosen indicator + col_name_us (str): column corresponding to national value for chosen indicator + bool_val (boolean): True or False depending on whether the column + should be sorted ascending + Returns (DataFrame): The top 10 worst counties for chosen indicator + """ + top_10 = df.sort_values(by=col_name, ascending=bool_val).head(10) + top10_df = top_10[["name_county", col_name]] + state_data = { + "name_county": f"{state}", + col_name: top_10[col_name_state].iloc[0], + } + national_data = { + "name_county": "United States", + col_name: top_10[col_name_us].iloc[0], + } + final_df = top10_df.append([state_data, national_data], ignore_index=True) + + return final_df + + ######## Voting Card ############# + def voting_card(state): + """ + Calculates the number for senators that voted yes or no + for the IRA (Climate Bill) legistation + + Inputs + state (str): state selected when interacting with the map + + Returns (tuple): Number of yes and no votes for the bill for the state + """ + voting_data = scrape_voting_behavior() + voting_data["state"] = voting_data.index + + df_voting = voting_data[voting_data["state"] == state] + yes_vote = df_voting["overal_yea"].iloc[0] + no_vote = df_voting["overall_nay"].iloc[0] + + return yes_vote, no_vote + + ############### Callbacks #################### + # Displays all the visuals created below based on the state selected on the choropleth map + + @app.callback( + [ + Output("bar-chart", "figure"), + Output("table", "data"), + Output("funding-table", "data"), + Output("unemployed-bar", "figure"), + Output("insurance-bar", "figure"), + Output("income-bar", "figure"), + Output("education-bar", "figure"), + Output("voting", "figure"), + ], + [Input("choropleth-map", "clickData")], + ) + def generate_graphs(clickData): + if clickData is not None: + state = clickData["points"][0]["location"] + + # Create a bar graph + df_climate = get_cleaned_data( + "snowlm/data/disaster_declarations.csv", only_2000_onwards=True + ) + + num_days_in_disaster = { + "states": number_of_days_in_dec_disaster(df_climate).keys(), + "values": number_of_days_in_dec_disaster(df_climate).values(), + } + disaster_days = pd.DataFrame.from_dict(num_days_in_disaster) + + fig4 = px.bar( + disaster_days, + x="states", + y="values", + title="Average Number of Days Yearly in a Disaster Scenario", + ) + highlight_values = [f"{state}", "National Average"] + highlight_color = "red" + fig4.update_traces( + marker=dict( + color=[ + highlight_color if x in highlight_values else "blue" + for x in disaster_days["states"] + ] + ) + ) + fig4.update_yaxes(title_text="Average Number of Days") + fig4.update_layout(title_x=0.5) + + #Create data table for top five disaster events for each state + top5_disasters = disaster_events[disaster_events['state'] == state] + top_5 = top5_disasters.sort_values(by='total_number_of_events', ascending=False).head(5) + + top_5_table = top_5.to_dict('records') + + #Create data table for top five states receiving federal funding + top5_funding = top_funding[top_funding['state'] == state] + top_5_assistance = top5_funding.sort_values(by='fed_amount', ascending=False).head(5) + + top_5_assistance_table = top_5_assistance.to_dict('records') + + + # Create visuals for county level information from each state + df_census = api_query() + df_census = df_census.loc[df_census["state_and_county_code"] != "48301"] + click_data = df_census[df_census["state_code_alpha"] == state] + state_name = click_data["name_state"].iloc[0] + + top10_unemployed = get_top_10_counties( + click_data, + state_name, + "percent_unemployed", + "percent_unemployed_state", + "percent_unemployed_us", + False, + ) + fig5 = px.bar( + data_frame=top10_unemployed, + x="name_county", + y="percent_unemployed", + color_discrete_sequence=["#FF6B35"], + ) + fig5.update_layout( + title=f"Comparison of Unemployment Rate in Counties to {state_name} and National Average" + ) + fig5.update_xaxes(title_text="Geographic Region") + fig5.update_yaxes(title_text="Unemployment Rate") + + top10_income = get_top_10_counties( + click_data, + state_name, + "median_household_income", + "median_household_income_state", + "median_household_income_us", + True, + ) + fig6 = px.bar( + data_frame=top10_income, + x="name_county", + y="median_household_income", + color_discrete_sequence=["#5603AD"], + ) + fig6.update_layout( + title=f"Comparison of Median Household Income in Counties to {state_name} & National Avg." + ) + fig6.update_xaxes(title_text="Geographic Region") + fig6.update_yaxes(title_text="Median Household Income") + + top10_noinsurance = get_top_10_counties( + click_data, + state_name, + "without_healthcare_coverage", + "without_healthcare_coverage_state", + "without_healthcare_coverage_us", + False, + ) + fig7 = px.bar( + data_frame=top10_noinsurance, + x="name_county", + y="without_healthcare_coverage", + color_discrete_sequence=["#006D77"], + ) + fig7.update_layout( + title="Comparison of Percent of Population Without Health Insurance Coverage" + ) + fig7.update_xaxes(title_text="Geographic Region") + fig7.update_yaxes(title_text="% of Population with No Health Insurance") + + top10_education = get_top_10_counties( + click_data, + state_name, + "bach_or_higher", + "bach_or_higher_state", + "bach_or_higher_us", + True, + ) + fig8 = px.bar( + data_frame=top10_education, + x="name_county", + y="bach_or_higher", + color_discrete_sequence=["#4CC9F0"], + ) + fig8.update_layout( + title=f"Comparison of Education Levels in Counties to {state_name} and National Average" + ) + fig8.update_xaxes(title_text="Geographic Region") + fig8.update_yaxes(title_text="Bachelor or Higher Education Completion Rate") + + # # Political Voting + color_map = {"Yes": "blue", "No": "green"} + fig9 = px.bar( + x=["Yes", "No"], + y=[voting_card(state)[0], voting_card(state)[1]], + color_discrete_map=color_map, + title=f"Senators Voting for the Climate Bill in {state_name}", + ) + fig9.update_xaxes(title_text="Voting Record") + fig9.update_yaxes(title_text="Number of Votes") + fig9.update_layout(title_x=0.5) + return ( + fig4, + top_5_table, + top_5_assistance_table, + fig5, + fig6, + fig7, + fig8, + fig9, + ) + return {} + + #################### Layout ###################### + + # Text Content for the Page + header = html.H4( + "Investigating Patterns of Climate-related Natural Disasters in the United States", + className="bg-primary text-white p-3 mb-2 text-center", + ) + + subheader = html.H5( + "Jackie Glasheen, Jen Yeaton, Harsh Vardhan Pachisia, Shwetha Srinivasan", + className="p-2 mb-2 text-center", + style={"font-size": "20px"}, + ) + + date = html.H5( + "March 2023", className="p-2 mb-2 text-center", style={"font-size": "12px"} + ) + + intro_text = html.Div( + [ + html.P( + [ + html.Strong("42.63%"), + " of natural " + "disasters in the United States since 1980" + " have taken place over the last 12 years. It is evident that climate " + "change and global warming are causing extreme weather disasters to " + "occur with more frequency. The increase in natural disaster declarations " + "over the past several decades has led to the federal government spending " + "more money on disaster relief. Due to the increase in frequency and cost " + "of such disasters, a Congressional Research Service ", + html.A("paper", href="https://sgp.fas.org/crs/homesec/R45484.pdf"), + " from January " + "2022 suggests that Congress may consider limiting federal disaster relief " + "spending.", + ] + ), + html.P( + [ + "Disasters impact different geographic regions, affecting specific states " + "and communities disproportionately. Through this dashboard, we hope to " + "shed light on the increase in disaster frequency and cost nationwide. " + "We highlight the specific situation in each state, where its political " + "stance is on climate, and showcase the top 10 counties that are at most " + "risk based on current socio-economic factors and require long-term " + "policy actions to tackle disasters." + ] + ), + html.P( + [ + "This dashboard was built using Python and Dash, using ", + html.A( + "climate disaster", + href="https://www.fema.gov/openfema-data-page/disaster-declarations-summaries-v2", + ), + " and ", + html.A( + "public assistance", + href="https://www.fema.gov/openfema-data-page/public-assistance-funded-project-summaries-v1", + ), + " data from the Federal Emergency Management Agency, " + "scraped data of the voting patterns on the Climate IRA bill, and the " + "US Census API for county, state and national-level socio-economic breakdown.", + ] + ), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "20px"}, + ) + bar_text = html.Div( + [ + html.P( + [ + "The number of disaster events is steadily increasing over time. " + "2011 stands out as the ", + html.A( + "“Year of Natural Disasters”", + href="https://www.livescience.com/17769-2011-record-natural-disasters-infographic.html#:~:text=The%20United%20States%20was%20hit,climate%20change%20is%20a%20contributor.", + ), + " breaking the record for costly, weather-related disasters, including " + "drought, wildfire, tornados, flooding, a blizzard, and a hurricane, " + "all as a result of climate change.", + ] + ), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "20px"}, + ) + + maps_text = html.Div( + [ + html.P( + [ + "Choose between the number of disaster events or the public " + "assistance provided for disaster management to see how their patterns " + "have changed between 2000-2022. While there is certainly " + "year to year variation, in general, we see that California, " + "Texas, and Florida face the most amount of disasters (not normalized " + "by landmass). ", + html.Strong( + "Click on a state" + " to get granular state and county-level information!" + ), + ], + ), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "20px"}, + ) + + bubble_map_text = html.Div( + [ + html.P( + "Press play to see the relationship between the number of disaster " + "events, and the amount of public assistance provided, relative to the " + "size of the state’s population. Certain states even with smaller populations " + "and fewer disasters get a lot more funding as compared to others." + ), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "20px"}, + ) + + state_text = html.Div( + [ + html.P( + [ + "See how your state compares to others in being in a declared disaster " + "scenario. On average, a state is in a situation where a disaster has been " + "declared 15 days a year between 2000-2022. The Federated States of Micronesia " + "(FM) stands out as an outlier since it is located in the Pacific Ring " + "of Fire and is prone to ", + html.A( + "disasters.", + href="https://www.undrr.org/media/81878/download#:~:text=FSM%20is%20located%20in%20the,claim%20people's%20lives%20and%20livestock.", + ), + ] + ), + html.P( + [ + "The Inflation Reduction Act of 2022 calls for investment in " + "domestic clean energy production and aims to substantially reduce carbon " + "emissions. However, we found that senators who voted for the bill were " + "not necessarily disproportionately impacted by disasters, but rather " + "the vote was along party lines." + ] + ), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "20px"}, + ) + + table_text = html.Div( + [ + html.P( + [ + "The table to the left lists the top 5 disasters, and the type " + "of disaster, over the time period 2000-2022.", + ] + ), + html.P( + [ + "The table to the right lists the top 5 disasters based on public " + "assistance funding received from FEMA, and the type " + "of disaster, over the time period 2000-2022." + ] + ), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "20px"}, + ) + + census_text = html.Div( + [ + html.P( + " At the county level, we can see in greater detail some information" + "about the populations in each state and their" + " socioeconomic circumstances. We’ve highlighted some circumstances" + " (such as lack of health insurance and unemployment) that would make" + " dealing with weather-related disasters especially challenging for " + " these populations. In the bar charts below, clockwise, we show the" + " the ten counties with the highest rates of unemployment, the ten counties" + " with the lowest household income levels, and the ten counties with the" + " greatest percent of the population without health insurance and the " + "ten counties with the lowest rates of higher education." + ), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "20px"}, + ) + + conclusion_text = html.Div( + [ + html.P( + "This dashboard highlights the overall increase in climate disasters " + "by showing their trend, breaking down that trend by geography, disaster " + "type, and FEMA spending, and further listing the top 5 events by state. " + "In addition, we presented this data alongside information about how the " + "senators in a state voted on the recent federal climate legislation and " + "relevant demographic information for the various states and counties. " + "To build upon this work, further analytical connections between climate " + "disasters and other data sources should be considered. For example, are " + "racial minorities disproportionately affected by climate disasters? " + "Moreover, some adjustments to the data may be necessary. For instance, " + "the FEMA money granted as a result of climate disasters should be " + "inflation-adjusted. Finally, more investigation is required to understand " + "the relationship between some of the disaster types used in the FEMA data " + "and global warming, and whether certain disaster types have been used " + "consistently over time in the data." + ), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "20px"}, + ) + + # Section Header Text + + intro1_text = html.Div( + [ + html.H2([html.Strong("Introduction:")]), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "15px"}, + ) + + section1_text = html.Div( + [ + html.H2([html.Strong("Section 1: National Trends")]), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "15px"}, + ) + + section2_text = html.Div( + [ + html.H2([html.Strong("Section 2: State-Level Trends")]), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "15px"}, + ) + + section3_text = html.Div( + [ + html.H2([html.Strong("Section 3: County-Level Trends")]), + ], + className="my-4", + style={"color": "black", "font-family": "Garamond", "font-size": "15px"}, + ) + + ################ Final App Layout ################### + + app.layout = dbc.Container( + [ + header, + subheader, + date, + intro1_text, + intro_text, + section1_text, + bar_text, + dbc.Row( + [ + dbc.Col( + [ + dcc.Graph( + id="stacked-bar-chart", + figure=fig1, + style={"height": "600px"}, + ), + ], + width={"size": 12, "offset": 0, "order": 1}, + ), + ] + ), + section2_text, + maps_text, + dbc.Row( + [ + dbc.Col( + [ + dropdown, + dcc.Graph(id="choropleth-map", style={"height": "600px"}), + ], + width={"size": 12, "offset": 0, "order": 2}, + ), + ] + ), + bubble_map_text, + dbc.Row( + [ + dbc.Col( + [ + dcc.Graph( + id="scatter-bubble", + figure=fig3, + style={"height": "600px"}, + ) + ], + width={"size": 12, "offset": 0, "order": 1}, + ), + ] + ), + state_text, + dbc.Row( + [ + dbc.Col( + [dcc.Graph(id="bar-chart")], + width={"size": 8, "offset": 0, "order": 1}, + ), + dbc.Col( + [dcc.Graph(id="voting")], + width={"size": 4, "offset": 0, "order": 2}, + ), + ] + ), + table_text, + dbc.Row( + [ + dbc.Col([dbc.Label("Top 5 Disaster Events"), table], md=6), + dbc.Col( + [ + dbc.Label( + "Top 5 Disaster Events by FEMA Public Assistance" + ), + funding_table, + ], + md=6, + ), + ] + ), + section3_text, + census_text, + dbc.Row( + [ + dbc.Col( + [dcc.Graph(id="unemployed-bar")], + width={"size": 6, "offset": 0, "order": 1}, + ), + dbc.Col( + [dcc.Graph(id="insurance-bar")], + width={"size": 6, "offset": 0, "order": 2}, + ), + ] + ), + dbc.Row( + [ + dbc.Col( + [dcc.Graph(id="income-bar")], + width={"size": 6, "offset": 0, "order": 1}, + ), + dbc.Col( + [dcc.Graph(id="education-bar")], + width={"size": 6, "offset": 0, "order": 2}, + ), + ] + ), + conclusion_text, + ], + fluid=True, + className="dbc", + ) + + app.run_server(host="127.0.0.1", port=8055, debug=False) diff --git a/snowlm/run.py b/snowlm/run.py deleted file mode 100644 index 7f64b71..0000000 --- a/snowlm/run.py +++ /dev/null @@ -1,10 +0,0 @@ -from snowlm.scrape_api.voting_record import scrape_voting_behavior -from snowlm.data_analysis.climate import ( - clean_disaster_summaries) -# this should just be in a main file with a bunch of run functions. -# moved the getting of the climate and econ datasets to climate_datasets.py - -def get_voting_data(): - return scrape_voting_behavior() - -## add neccessary function calls here. \ No newline at end of file diff --git a/snowlm/scrape_api/__init__.py b/snowlm/scrape_api/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/snowlm/scrape_api/__init__.py @@ -0,0 +1 @@ + diff --git a/snowlm/scrape_api/census_api_query.py b/snowlm/scrape_api/census_api_query.py index 0484c4b..61170db 100644 --- a/snowlm/scrape_api/census_api_query.py +++ b/snowlm/scrape_api/census_api_query.py @@ -12,6 +12,7 @@ import pathlib import pandas as pd import requests +import os def api_query(): ''' @@ -34,7 +35,7 @@ def api_query(): data_year = "/2021" #3. Add the dataset name acronym: - #https://api.census.gov/data/2019/acs/acs5 + #https://api.census.gov/data/2021/acs/acs5 dataset_name_acronym = "/acs/acs5/profile" #4. Add ?get= to the query: @@ -42,9 +43,9 @@ def api_query(): get = "?get=" #5. Add variables: - list_of_vars_county = "NAME,DP02_0001E,DP03_0009PE,DP03_0062E,DP03_0099PE,DP02_0067PE,DP05_0037PE,DP05_0038PE,DP05_0039PE,DP05_0044PE,DP05_0052PE,DP05_0057PE,DP05_0058PE" - list_of_vars_state = "NAME,DP02_0001E,DP03_0009PE,DP03_0062E,DP03_0099PE,DP02_0067PE" - list_of_vars_us = "NAME,DP02_0001E,DP03_0009PE,DP03_0062E,DP03_0099PE,DP02_0067PE" + list_of_vars_county = "NAME,DP02_0001E,DP03_0009PE,DP03_0062E,DP03_0099PE,DP02_0068PE,DP05_0037PE,DP05_0038PE,DP05_0039PE,DP05_0044PE,DP05_0052PE,DP05_0057PE,DP05_0058PE" + list_of_vars_state = "NAME,DP02_0001E,DP03_0009PE,DP03_0062E,DP03_0099PE,DP02_0068PE" + list_of_vars_us = "NAME,DP02_0001E,DP03_0009PE,DP03_0062E,DP03_0099PE,DP02_0068PE" ''' See below for descriptions of each variable: @@ -53,10 +54,10 @@ def api_query(): #DP02_0001E = total households #DP03_0009PE = Percent Estimate!!EMPLOYMENT STATUS!!Civilian labor force!!Unemployment Rate - #DP03_0062E = Estimate!!INCOME AND BENEFITS (IN 2018 INFLATION-ADJUSTED DOLLARS)!!Total households!!Median household income (dollars) + #DP03_0062E = Estimate!!INCOME AND BENEFITS (IN 2021 INFLATION-ADJUSTED DOLLARS)!!Total households!!Median household income (dollars) #DP03_0099PE = Percent Estimate!!HEALTH INSURANCE COVERAGE!!Civilian noninstitutionalized population!!No health insurance coverage - #DP02_0067PE = Percent Estimate!!EDUCATIONAL ATTAINMENT!!Population 25 years and over!!Bachelor's degree or higher + #DP02_0068PE = Percent Estimate!!EDUCATIONAL ATTAINMENT!!Population 25 years and over!!Bachelor's degree or higher #DP05_0037PE = Percent Estimate!!RACE!!Total population!!One race!!White #DP05_0038PE = Percent Estimate!!RACE!!Total population!!One race!!Black or African American @@ -65,6 +66,8 @@ def api_query(): #DP05_0052PE = Percent Estimate!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander #DP05_0057PE = Percent Estimate!!RACE!!Total population!!One race!!Some other race #DP05_0058PE = Percent Estimate!!RACE!!Total population!!Two or more races + + https://api.census.gov/data/2021/acs/acs5/profile/variables.html ''' #6. Add geography for county, state, and country: @@ -73,7 +76,7 @@ def api_query(): geo_us = "&for=us:*" #7. Add census API key for this project: - census_api_key = "&key=dbaf6b8c0aa053d4df5ae844bba98940952fc50b" + census_api_key = "&key=" + os.environ["CENSUS_API_KEY"] #8. Create f strings query_url_county = f"{host_name}{data_year}{dataset_name_acronym}{get}{list_of_vars_county}{geo_county}{census_api_key}" @@ -89,13 +92,9 @@ def api_query(): response_county = requests.get(query_url_county) response_state = requests.get(query_url_state) response_us = requests.get(query_url_us) - census_json_county = response_county.json() census_json_state = response_state.json() census_json_us = response_us.json() - #print(census_json_count) - #print(census_json_state) - #print(census_json_us) #Create cleaned and merged pandas dataframe from the three above json files: full_census_df = sep_jsons_to_merged_cleaned_dataframes(census_json_county, @@ -124,31 +123,20 @@ def sep_jsons_to_merged_cleaned_dataframes(census_json_county, census_json_state ''' #Create lists for each dataset's variable names: - column_names_county = ["name", "total_households", "percent_unemployed", "median_household_income", + column_names_county = ["name_county", "total_households", "percent_unemployed", "median_household_income", "without_healthcare_coverage", "bach_or_higher", "percent_white", "percent_blackORaa", "percent_ai_and_an", "percent_asian", "percent_nh_and_pi", "percent_race_other", "percent_race_two_more", "state_code", "county_code"] - column_names_state = ["name", "total_households_state", "percent_unemployed_state", "median_household_income_state", + column_names_state = ["name_state", "total_households_state", "percent_unemployed_state", "median_household_income_state", "without_healthcare_coverage_state", "bach_or_higher_state", "state_code"] - column_names_us = ["name", "total_households_us", "percent_unemployed_us", "median_household_income_us", + column_names_us = ["name_country", "total_households_us", "percent_unemployed_us", "median_household_income_us", "without_healthcare_coverage_us", "bach_or_higher_us", "country_code"] #Save each file as a dataframe: census_df_county = pd.DataFrame(columns = column_names_county, data = census_json_county[1:]) census_df_state = pd.DataFrame(columns = column_names_state, data = census_json_state[1:]) census_df_us = pd.DataFrame(columns = column_names_us, data = census_json_us[1:]) - print("census_df_county: ", census_df_county.head) - print("census_df_state: ", census_df_state.head) - print("census_df_us: ", census_df_us.head) - - #REMOVE DIRECTLY BELOW - JUST FOR CHECKING - result1 = census_df_county.dtypes - result2 = census_df_state.dtypes - result3 = census_df_us.dtypes - print(result1) - print(result2) - print(result3) #Checking variable types and making any revisions necessary to census_df_county: clean_census_df_county = clean_county_level_census_data(census_df_county) @@ -157,25 +145,13 @@ def sep_jsons_to_merged_cleaned_dataframes(census_json_county, census_json_state clean_census_df_state = clean_state_level_census_data(census_df_state) #Checking variable types and making any revisions necessary to census_df_us: - clean_census_df_county = clean_us_level_census_data(census_df_us) + clean_census_df_us = clean_us_level_census_data(census_df_us) #Citation for loading in data and changing its types: https://www.youtube.com/watch?v=l47HptzM7ao - #REMOVE THESE CHECKS LATER: - result1 = census_df_county.dtypes - result2 = census_df_state.dtypes - result3 = census_df_us.dtypes - print(result1) - print(result2) - print(result3) - #Combine census_df_county, census_df_state, and census_df_us into full_census_df - census_df_stateANDus = census_df_state.merge(census_df_us, how = "outer", on = "country_code") - full_census_df = census_df_county.merge(census_df_stateANDus, how = "outer", on = "state_code") - - #REMOVE THESE CHECKS: - #pd.set_option('display.max_columns', None) - #full_census_df.head + census_df_stateANDus = clean_census_df_state.merge(clean_census_df_us, how = "outer", on = "country_code") + full_census_df = clean_census_df_county.merge(census_df_stateANDus, how = "outer", on = "state_code") #return census_df_county, census_df_state, census_df_us return full_census_df @@ -209,7 +185,20 @@ def clean_county_level_census_data(census_df_county): #Add a variable to census_df_county that is a concatenation of the state code and the county code: census_df_county["state_and_county_code"] = census_df_county["state_code"] + census_df_county["county_code"] - return census_df_county + #Add a variable to census_df_county that is an alphabetic code for states (e.g., IL, NJ, WI) + #(The code in the next 4 lines is a revised version of code written by Jackie Glasheen + #for another dataset in this project) + file_path = "snowlm/data/Census_State_codes.txt" + state_code_alpha_and_numeric = pd.read_csv(file_path, sep='|') + state_code_alpha_and_numeric = state_code_alpha_and_numeric.drop(columns + =['STATE_NAME','STATENS']) + state_code_alpha_and_numeric = state_code_alpha_and_numeric.rename(columns + ={"STATE": "state_code", "STUSAB": "state_code_alpha"}) + census_df_county["state_code"] = census_df_county["state_code"].astype(int) + census_df_county_w_statecodes = pd.merge(census_df_county, + state_code_alpha_and_numeric, how = "left", on = "state_code") + + return census_df_county_w_statecodes @@ -231,6 +220,7 @@ def clean_state_level_census_data(census_df_state): census_df_state["without_healthcare_coverage_state"] = census_df_state["without_healthcare_coverage_state"].astype(float) census_df_state["bach_or_higher_state"] = census_df_state["bach_or_higher_state"].astype(float) census_df_state["country_code"] = 1 + census_df_state["state_code"] = census_df_state["state_code"].astype(int) return census_df_state diff --git a/snowlm/scrape_api/voting_record.py b/snowlm/scrape_api/voting_record.py index 07c249d..c7d6acd 100644 --- a/snowlm/scrape_api/voting_record.py +++ b/snowlm/scrape_api/voting_record.py @@ -1,3 +1,14 @@ +''' +CAPP 30122 +Team: Snow Laughing Matter +Author: Jackie Glasheen + +Code for scraping and processing senator voting on the Inflation Reduction Act + +Source web page: +https://www.senate.gov/legislative/LIS/roll_call_votes/vote1172/vote_117_2_00325.htm +''' + import requests import lxml.html import pandas as pd @@ -5,69 +16,53 @@ def scrape_voting_behavior(): """ - Scrapes the Senator voting behavior on the Inflation Reduction Act + Scrapes the Senator voting behavior on the Inflation Reduction Act. - Returns: dictionary mapping states to the number of senator "Yay" votes for the bill + Returns (df) a pandas dataframe with the number of senators voting "Yay" and + "Nay" votes for the bill, by state and political party. """ - - response = requests.get("https://www.senate.gov/legislative/LIS/roll_call_votes/vote1172/vote_117_2_00325.htm") - #print(response.text) + response = requests.get( + "https://www.senate.gov/legislative/LIS/roll_call_votes/vote1172/vote_117_2_00325.htm") root = lxml.html.fromstring(response.content) - root.cssselect("b")[0].text_content() - c = root.cssselect("b")[0].text_content() c = root.cssselect("div.contenttext")[30:180] - + senator_voting_by_state = {} for i, row in enumerate(c): - #print(i, row.text_content()) - value_list = () # Removing the state name that is brought in as every third observation if i % 3 == 0: continue + # Extracting key information vote = row.text_content()[-4:-1] - #print(vote) state = row.text_content()[-9:-7] - #print(state) party = row.text_content()[-11:-10] - #print(party) if state in senator_voting_by_state: - overal_yea, D_yea, D_nay, R_yea, R_nay = senator_voting_by_state[state] - if vote == "Yea": - overal_yea += 1 - if (party == "D" or party == "I"): - D_yea += 1 - if party == "R": - R_yea += 1 - if vote == "Nay": - if (party == "D" or party == "I"): - D_nay += 1 - if party == "R": - R_nay += 1 - + overal_yea, overall_nay, D_yea, D_nay, R_yea, R_nay = senator_voting_by_state[state] else: - senator_voting_by_state[state] = (0,0,0,0,0) - overal_yea, D_yea, D_nay, R_yea, R_nay = senator_voting_by_state[state] - if vote == "Yea": - overal_yea += 1 - if (party == "D" or party == "I"): - D_yea += 1 - if party == "R": - R_yea += 1 - if vote == "Nay": - if (party == "D" or party == "I"): - D_nay += 1 - if party == "R": - R_nay += 1 - - senator_voting_by_state[state] = (overal_yea, D_yea, D_nay, R_yea, R_nay) - - dataframe = pd.DataFrame.from_dict(senator_voting_by_state, orient='index', - columns=['overal_yea', 'D_yea', 'D_nay', 'R_yea', 'R_nay']) - #print(dataframe) - #print(senator_voting_by_state) + senator_voting_by_state[state] = (0,0,0,0,0,0) + overal_yea, overall_nay, D_yea, D_nay, R_yea, R_nay = senator_voting_by_state[state] + + if vote == "Yea": + overal_yea += 1 + if party in ("D","I"): + D_yea += 1 + if party == "R": + R_yea += 1 + if vote == "Nay": + overall_nay += 1 + if party in ("D","I"): + D_nay += 1 + if party == "R": + R_nay += 1 + + senator_voting_by_state[state] = (overal_yea, overall_nay, D_yea, D_nay, + R_yea, R_nay) + + dataframe = pd.DataFrame.from_dict(senator_voting_by_state, orient='index', + columns=['overal_yea', 'overall_nay', 'D_yea', 'D_nay', 'R_yea', 'R_nay']) + return dataframe