From 85d09b2dd61d27efa96fe576de40ce6063a3b5d7 Mon Sep 17 00:00:00 2001 From: Lu Weizheng Date: Thu, 11 Jan 2024 09:56:21 +0800 Subject: [PATCH] refactor to sphinx& and plotly --- .github/workflows/deploy.yml | 37 + .gitignore | 4 +- _config.yml | 41 - _toc.yml | 65 +- build.sh | 8 +- ...oding-styles.ipynb => coding-styles.ipynb} | 0 .../{matplotlib-data.ipynb => data.ipynb} | 0 ...ib-figure-axes.ipynb => figure-axes.ipynb} | 1 + .../{matplotlib-intro.ipynb => intro.ipynb} | 0 ...arameters.ipynb => other-parameters.ipynb} | 0 ...tlib-plot-types.ipynb => plot-types.ipynb} | 0 ch-plotly/index.md | 6 + ch-plotly/intro.ipynb | 141 +- conf.py | 48 + docs/.nojekyll | 0 ...6b948b0a78e3c44d5f3315310760f260236881.png | Bin 18306 -> 0 bytes ...1ec8da75ecbb83b6655f0d826679c4752d9659.png | Bin 6651 -> 0 bytes ...f223cde14a6261e0a0c6847c5eae4e66b36974.png | Bin 13134 -> 0 bytes ...f31098e3fbc06471cf9443a585a217071ca14d.png | Bin 21758 -> 0 bytes ...6dc307351230fdec5a32b76024580dded5d0ba.png | Bin 13881 -> 0 bytes ...fe56c7ab199037001caaa449d464f3ec1da5cf.png | Bin 12036 -> 0 bytes ...388a38ba4ee1e5ecfcd2d4aa5489be76541e25.png | Bin 7987 -> 0 bytes ...120dad266f23e1b0186bd2a5732708623cdeb0.png | Bin 54195 -> 0 bytes ...91d1ed19f7e7ace074ba29061d0434c07a0125.png | Bin 25611 -> 0 bytes ...42bb62c5d73c36d0cd8088f525e8215aecbf41.png | Bin 18094 -> 0 bytes ...29ff74f010fee9a46b2d2bcb8b87f6923cf739.png | Bin 12634 -> 0 bytes ...507ad3a3c14f0c7161c8e4159c9ece2b778cd0.png | Bin 9071 -> 0 bytes docs/_images/DataFrame.svg | 306 - docs/_images/Series.svg | 198 - ...eef311402d904954b77d7bd73b1af5c2c007f7.png | Bin 16592 -> 0 bytes docs/_images/alipay.png | Bin 115383 -> 0 bytes docs/_images/anatomy.webp | Bin 65490 -> 0 bytes docs/_images/concat.svg | 210 - ...bf4a326671637ed63df97a498fb09adead8ff5.png | Bin 16556 -> 0 bytes ...b8472005c483a31388fbfd0d7ea798ff675ddf.png | Bin 16328 -> 0 bytes ...08bee3f567d2c03f382b7478eda8a2c93029d6.png | Bin 20447 -> 0 bytes ...014ee5f9ac6dc9f72698e588b93005c436e75e.png | Bin 54594 -> 0 bytes ...71dde0e11b0101514ecbc3439e428f4d5a2d90.png | Bin 7510 -> 0 bytes ...b567e3adf8376e93b8e089551e47b1b85f1064.png | Bin 8253 -> 0 bytes docs/_images/file.svg | 1353 -- docs/_images/groupby.svg | 3 - docs/_images/melt.svg | 4 - docs/_images/merge-how.svg | 4 - docs/_images/merge.svg | 4 - docs/_images/pivot.svg | 444 - docs/_images/s1.svg | 202 - docs/_images/s2.svg | 193 - docs/_images/slicing.svg | 220 - docs/_images/wechat.png | Bin 117071 -> 0 bytes docs/_sources/ch-matplotlib/index.md | 6 - .../matplotlib-coding-styles.ipynb | 146 - .../ch-matplotlib/matplotlib-data.ipynb | 123 - .../matplotlib-figure-axes.ipynb | 313 - .../ch-matplotlib/matplotlib-intro.ipynb | 169 - .../matplotlib-other-parameters.ipynb | 296 - .../ch-matplotlib/matplotlib-plot-types.ipynb | 316 - docs/_sources/ch-numpy/index.md | 6 - .../ch-numpy/ndarray-slicing-index.ipynb | 341 - docs/_sources/ch-numpy/ndarray.ipynb | 1130 -- docs/_sources/ch-numpy/numpy-intro.ipynb | 1 - docs/_sources/ch-numpy/random.ipynb | 1316 -- .../ch-pandas/data-preprocessing.ipynb | 3449 ----- .../ch-pandas/dataframe-groupby.ipynb | 1076 -- .../ch-pandas/dataframe-merge-concat.ipynb | 1448 -- .../ch-pandas/dataframe-pivot-melt.ipynb | 1990 --- .../ch-pandas/dataframe-slicing.ipynb | 2493 ---- docs/_sources/ch-pandas/index.md | 6 - docs/_sources/ch-pandas/pandas-intro.md | 19 - .../_sources/ch-pandas/series-dataframe.ipynb | 1561 --- docs/_sources/index.md | 98 - ...e.4045f2051d55cab465a707391d5b2007.min.css | 1 - docs/_sphinx_design_static/design-tabs.js | 27 - .../_sphinx_javascript_frameworks_compat.js | 134 - docs/_static/basic.css | 930 -- docs/_static/check-solid.svg | 4 - docs/_static/clipboard.min.js | 7 - docs/_static/copy-button.svg | 5 - docs/_static/copybutton.css | 94 - docs/_static/copybutton.js | 248 - docs/_static/copybutton_funcs.js | 73 - ...e.4045f2051d55cab465a707391d5b2007.min.css | 1 - docs/_static/design-tabs.js | 27 - docs/_static/doctools.js | 264 - docs/_static/documentation_options.js | 14 - docs/_static/file.png | Bin 286 -> 0 bytes docs/_static/images/logo_binder.svg | 19 - docs/_static/images/logo_colab.png | Bin 7601 -> 0 bytes docs/_static/images/logo_deepnote.svg | 1 - docs/_static/images/logo_jupyterhub.svg | 1 - docs/_static/jquery-3.6.0.js | 10881 ---------------- docs/_static/jquery.js | 2 - docs/_static/language_data.js | 199 - .../locales/ar/LC_MESSAGES/booktheme.mo | Bin 1541 -> 0 bytes .../locales/ar/LC_MESSAGES/booktheme.po | 75 - .../locales/bg/LC_MESSAGES/booktheme.mo | Bin 1708 -> 0 bytes .../locales/bg/LC_MESSAGES/booktheme.po | 75 - .../locales/bn/LC_MESSAGES/booktheme.mo | Bin 1646 -> 0 bytes .../locales/bn/LC_MESSAGES/booktheme.po | 63 - .../locales/ca/LC_MESSAGES/booktheme.mo | Bin 1246 -> 0 bytes .../locales/ca/LC_MESSAGES/booktheme.po | 66 - .../locales/cs/LC_MESSAGES/booktheme.mo | Bin 1405 -> 0 bytes .../locales/cs/LC_MESSAGES/booktheme.po | 75 - .../locales/da/LC_MESSAGES/booktheme.mo | Bin 1304 -> 0 bytes .../locales/da/LC_MESSAGES/booktheme.po | 75 - .../locales/de/LC_MESSAGES/booktheme.mo | Bin 1388 -> 0 bytes .../locales/de/LC_MESSAGES/booktheme.po | 75 - .../locales/el/LC_MESSAGES/booktheme.mo | Bin 1722 -> 0 bytes .../locales/el/LC_MESSAGES/booktheme.po | 75 - .../locales/eo/LC_MESSAGES/booktheme.mo | Bin 1337 -> 0 bytes .../locales/eo/LC_MESSAGES/booktheme.po | 75 - .../locales/es/LC_MESSAGES/booktheme.mo | Bin 1396 -> 0 bytes .../locales/es/LC_MESSAGES/booktheme.po | 75 - .../locales/et/LC_MESSAGES/booktheme.mo | Bin 1341 -> 0 bytes .../locales/et/LC_MESSAGES/booktheme.po | 75 - .../locales/fi/LC_MESSAGES/booktheme.mo | Bin 1368 -> 0 bytes .../locales/fi/LC_MESSAGES/booktheme.po | 75 - .../locales/fr/LC_MESSAGES/booktheme.mo | Bin 1412 -> 0 bytes .../locales/fr/LC_MESSAGES/booktheme.po | 75 - .../locales/hr/LC_MESSAGES/booktheme.mo | Bin 1402 -> 0 bytes .../locales/hr/LC_MESSAGES/booktheme.po | 75 - .../locales/id/LC_MESSAGES/booktheme.mo | Bin 1323 -> 0 bytes .../locales/id/LC_MESSAGES/booktheme.po | 75 - .../locales/it/LC_MESSAGES/booktheme.mo | Bin 1403 -> 0 bytes .../locales/it/LC_MESSAGES/booktheme.po | 75 - .../locales/iw/LC_MESSAGES/booktheme.mo | Bin 1445 -> 0 bytes .../locales/iw/LC_MESSAGES/booktheme.po | 75 - .../locales/ja/LC_MESSAGES/booktheme.mo | Bin 1471 -> 0 bytes .../locales/ja/LC_MESSAGES/booktheme.po | 75 - .../locales/ko/LC_MESSAGES/booktheme.mo | Bin 1375 -> 0 bytes .../locales/ko/LC_MESSAGES/booktheme.po | 75 - .../locales/lt/LC_MESSAGES/booktheme.mo | Bin 1413 -> 0 bytes .../locales/lt/LC_MESSAGES/booktheme.po | 75 - .../locales/lv/LC_MESSAGES/booktheme.mo | Bin 1404 -> 0 bytes .../locales/lv/LC_MESSAGES/booktheme.po | 75 - .../locales/ml/LC_MESSAGES/booktheme.mo | Bin 1883 -> 0 bytes .../locales/ml/LC_MESSAGES/booktheme.po | 66 - .../locales/mr/LC_MESSAGES/booktheme.mo | Bin 1674 -> 0 bytes .../locales/mr/LC_MESSAGES/booktheme.po | 66 - .../locales/ms/LC_MESSAGES/booktheme.mo | Bin 1213 -> 0 bytes .../locales/ms/LC_MESSAGES/booktheme.po | 66 - .../locales/nl/LC_MESSAGES/booktheme.mo | Bin 1356 -> 0 bytes .../locales/nl/LC_MESSAGES/booktheme.po | 75 - .../locales/no/LC_MESSAGES/booktheme.mo | Bin 1317 -> 0 bytes .../locales/no/LC_MESSAGES/booktheme.po | 75 - .../locales/pl/LC_MESSAGES/booktheme.mo | Bin 1371 -> 0 bytes .../locales/pl/LC_MESSAGES/booktheme.po | 75 - .../locales/pt/LC_MESSAGES/booktheme.mo | Bin 1364 -> 0 bytes .../locales/pt/LC_MESSAGES/booktheme.po | 75 - .../locales/ro/LC_MESSAGES/booktheme.mo | Bin 1390 -> 0 bytes .../locales/ro/LC_MESSAGES/booktheme.po | 75 - .../locales/ru/LC_MESSAGES/booktheme.mo | Bin 1722 -> 0 bytes .../locales/ru/LC_MESSAGES/booktheme.po | 75 - .../locales/sk/LC_MESSAGES/booktheme.mo | Bin 1393 -> 0 bytes .../locales/sk/LC_MESSAGES/booktheme.po | 75 - .../locales/sl/LC_MESSAGES/booktheme.mo | Bin 1374 -> 0 bytes .../locales/sl/LC_MESSAGES/booktheme.po | 75 - .../locales/sr/LC_MESSAGES/booktheme.mo | Bin 1679 -> 0 bytes .../locales/sr/LC_MESSAGES/booktheme.po | 75 - .../locales/sv/LC_MESSAGES/booktheme.mo | Bin 1349 -> 0 bytes .../locales/sv/LC_MESSAGES/booktheme.po | 75 - .../locales/ta/LC_MESSAGES/booktheme.mo | Bin 1928 -> 0 bytes .../locales/ta/LC_MESSAGES/booktheme.po | 66 - .../locales/te/LC_MESSAGES/booktheme.mo | Bin 1806 -> 0 bytes .../locales/te/LC_MESSAGES/booktheme.po | 66 - .../locales/tg/LC_MESSAGES/booktheme.mo | Bin 1628 -> 0 bytes .../locales/tg/LC_MESSAGES/booktheme.po | 75 - .../locales/th/LC_MESSAGES/booktheme.mo | Bin 1766 -> 0 bytes .../locales/th/LC_MESSAGES/booktheme.po | 75 - .../locales/tl/LC_MESSAGES/booktheme.mo | Bin 1273 -> 0 bytes .../locales/tl/LC_MESSAGES/booktheme.po | 66 - .../locales/tr/LC_MESSAGES/booktheme.mo | Bin 1373 -> 0 bytes .../locales/tr/LC_MESSAGES/booktheme.po | 75 - .../locales/uk/LC_MESSAGES/booktheme.mo | Bin 1681 -> 0 bytes .../locales/uk/LC_MESSAGES/booktheme.po | 75 - .../locales/ur/LC_MESSAGES/booktheme.mo | Bin 1462 -> 0 bytes .../locales/ur/LC_MESSAGES/booktheme.po | 66 - .../locales/vi/LC_MESSAGES/booktheme.mo | Bin 1431 -> 0 bytes .../locales/vi/LC_MESSAGES/booktheme.po | 75 - .../locales/zh_CN/LC_MESSAGES/booktheme.mo | Bin 1310 -> 0 bytes .../locales/zh_CN/LC_MESSAGES/booktheme.po | 75 - .../locales/zh_TW/LC_MESSAGES/booktheme.mo | Bin 1341 -> 0 bytes .../locales/zh_TW/LC_MESSAGES/booktheme.po | 75 - docs/_static/logo.png | Bin 9854 -> 0 bytes docs/_static/minus.png | Bin 90 -> 0 bytes ...69c37c29e427902b24a333a5f9fcb2f0b3ac41.css | 2342 ---- docs/_static/plus.png | Bin 90 -> 0 bytes docs/_static/pygments.css | 152 - docs/_static/sbt-webpack-macros.html | 11 - docs/_static/scripts/bootstrap.js | 3 - docs/_static/scripts/bootstrap.js.LICENSE.txt | 5 - docs/_static/scripts/bootstrap.js.map | 1 - docs/_static/scripts/pydata-sphinx-theme.js | 2 - .../scripts/pydata-sphinx-theme.js.map | 1 - docs/_static/scripts/sphinx-book-theme.js | 2 - docs/_static/scripts/sphinx-book-theme.js.map | 1 - docs/_static/searchtools.js | 531 - docs/_static/sphinx-thebe.css | 129 - docs/_static/sphinx-thebe.js | 126 - docs/_static/styles/bootstrap.css | 6 - docs/_static/styles/bootstrap.css.map | 1 - docs/_static/styles/pydata-sphinx-theme.css | 2 - .../styles/pydata-sphinx-theme.css.map | 1 - docs/_static/styles/sphinx-book-theme.css | 8 - docs/_static/styles/theme.css | 2 - docs/_static/togglebutton.css | 160 - docs/_static/togglebutton.js | 187 - docs/_static/underscore-1.13.1.js | 2042 --- docs/_static/underscore.js | 6 - .../vendor/fontawesome/6.1.2/LICENSE.txt | 165 - .../vendor/fontawesome/6.1.2/css/all.min.css | 5 - .../vendor/fontawesome/6.1.2/js/all.min.js | 2 - .../6.1.2/js/all.min.js.LICENSE.txt | 5 - .../6.1.2/webfonts/fa-brands-400.ttf | Bin 181264 -> 0 bytes .../6.1.2/webfonts/fa-brands-400.woff2 | Bin 105112 -> 0 bytes .../6.1.2/webfonts/fa-regular-400.ttf | Bin 60236 -> 0 bytes .../6.1.2/webfonts/fa-regular-400.woff2 | Bin 24028 -> 0 bytes .../6.1.2/webfonts/fa-solid-900.ttf | Bin 389948 -> 0 bytes .../6.1.2/webfonts/fa-solid-900.woff2 | Bin 154840 -> 0 bytes .../6.1.2/webfonts/fa-v4compatibility.ttf | Bin 10084 -> 0 bytes .../6.1.2/webfonts/fa-v4compatibility.woff2 | Bin 4776 -> 0 bytes docs/_static/webpack-macros.html | 31 - docs/ch-matplotlib/index.html | 514 - .../matplotlib-coding-styles.html | 606 - docs/ch-matplotlib/matplotlib-data.html | 586 - .../ch-matplotlib/matplotlib-figure-axes.html | 688 - docs/ch-matplotlib/matplotlib-intro.html | 617 - .../matplotlib-other-parameters.html | 703 - docs/ch-matplotlib/matplotlib-plot-types.html | 699 - docs/ch-numpy/index.html | 512 - docs/ch-numpy/ndarray-slicing-index.html | 734 -- docs/ch-numpy/ndarray.html | 1108 -- docs/ch-numpy/numpy-intro.html | 543 - docs/ch-numpy/random.html | 1325 -- docs/ch-pandas/data-preprocessing.html | 3168 ----- docs/ch-pandas/dataframe-groupby.html | 1310 -- docs/ch-pandas/dataframe-merge-concat.html | 1512 --- docs/ch-pandas/dataframe-pivot-melt.html | 2050 --- docs/ch-pandas/dataframe-slicing.html | 2430 ---- docs/ch-pandas/index.html | 515 - docs/ch-pandas/pandas-intro.html | 544 - docs/ch-pandas/series-dataframe.html | 1524 --- docs/datasets/sales/sales.csv | 18 - docs/datasets/student-score/score.csv | 44 - docs/datasets/student-score/student.csv | 45 - docs/genindex.html | 418 - docs/index.html | 590 - docs/objects.inv | Bin 959 -> 0 bytes docs/search.html | 430 - docs/searchindex.js | 1 - requirements-dev.txt | 1 - requirements-web.txt | 11 + requirements.txt | 5 +- 252 files changed, 204 insertions(+), 64994 deletions(-) create mode 100644 .github/workflows/deploy.yml delete mode 100644 _config.yml rename ch-matplotlib/{matplotlib-coding-styles.ipynb => coding-styles.ipynb} (100%) rename ch-matplotlib/{matplotlib-data.ipynb => data.ipynb} (100%) rename ch-matplotlib/{matplotlib-figure-axes.ipynb => figure-axes.ipynb} (99%) rename ch-matplotlib/{matplotlib-intro.ipynb => intro.ipynb} (100%) rename ch-matplotlib/{matplotlib-other-parameters.ipynb => other-parameters.ipynb} (100%) rename ch-matplotlib/{matplotlib-plot-types.ipynb => plot-types.ipynb} (100%) create mode 100644 ch-plotly/index.md create mode 100644 conf.py delete mode 100644 docs/.nojekyll delete mode 100644 docs/_images/0293520e5f5f443ee51e5709c66b948b0a78e3c44d5f3315310760f260236881.png delete mode 100644 docs/_images/0f63f28f91aaa84251a635b26c1ec8da75ecbb83b6655f0d826679c4752d9659.png delete mode 100644 docs/_images/25df2062ad3700c81a8b794b1ef223cde14a6261e0a0c6847c5eae4e66b36974.png delete mode 100644 docs/_images/2fdf2bed5b90c10e872146a5cff31098e3fbc06471cf9443a585a217071ca14d.png delete mode 100644 docs/_images/31d8d421ef2bad15c8179516426dc307351230fdec5a32b76024580dded5d0ba.png delete mode 100644 docs/_images/39063340c9e25eb66e6095c93ffe56c7ab199037001caaa449d464f3ec1da5cf.png delete mode 100644 docs/_images/420b699540684c1fcf4f5859f0388a38ba4ee1e5ecfcd2d4aa5489be76541e25.png delete mode 100644 docs/_images/5f97d746cc7ecc6f6b019798aa120dad266f23e1b0186bd2a5732708623cdeb0.png delete mode 100644 docs/_images/6bd7d9d25eebe62946769f82cf91d1ed19f7e7ace074ba29061d0434c07a0125.png delete mode 100644 docs/_images/6dd65582ff0bb2b9399d06f49842bb62c5d73c36d0cd8088f525e8215aecbf41.png delete mode 100644 docs/_images/7556072b7a36943860bd4c1c5829ff74f010fee9a46b2d2bcb8b87f6923cf739.png delete mode 100644 docs/_images/8c40a6f573c4124594486eec5c507ad3a3c14f0c7161c8e4159c9ece2b778cd0.png delete mode 100644 docs/_images/DataFrame.svg delete mode 100644 docs/_images/Series.svg delete mode 100644 docs/_images/a16d85caab45576176dc3f2bc6eef311402d904954b77d7bd73b1af5c2c007f7.png delete mode 100644 docs/_images/alipay.png delete mode 100644 docs/_images/anatomy.webp delete mode 100644 docs/_images/concat.svg delete mode 100644 docs/_images/ddc64ab226fd1a3956c71f9c6cbf4a326671637ed63df97a498fb09adead8ff5.png delete mode 100644 docs/_images/e13468724a69b18b97067266b4b8472005c483a31388fbfd0d7ea798ff675ddf.png delete mode 100644 docs/_images/e6bee8d9621c3b7a478c3ec6bc08bee3f567d2c03f382b7478eda8a2c93029d6.png delete mode 100644 docs/_images/f1c9ad9d185b1ecc447c984033014ee5f9ac6dc9f72698e588b93005c436e75e.png delete mode 100644 docs/_images/f3702c41b2405758845e552aa271dde0e11b0101514ecbc3439e428f4d5a2d90.png delete mode 100644 docs/_images/fa955cffcfe65fef1120e5b0e3b567e3adf8376e93b8e089551e47b1b85f1064.png delete mode 100644 docs/_images/file.svg delete mode 100644 docs/_images/groupby.svg delete mode 100644 docs/_images/melt.svg delete mode 100644 docs/_images/merge-how.svg delete mode 100644 docs/_images/merge.svg delete mode 100644 docs/_images/pivot.svg delete mode 100644 docs/_images/s1.svg delete mode 100644 docs/_images/s2.svg delete mode 100644 docs/_images/slicing.svg delete mode 100644 docs/_images/wechat.png delete mode 100644 docs/_sources/ch-matplotlib/index.md delete mode 100644 docs/_sources/ch-matplotlib/matplotlib-coding-styles.ipynb delete mode 100644 docs/_sources/ch-matplotlib/matplotlib-data.ipynb delete mode 100644 docs/_sources/ch-matplotlib/matplotlib-figure-axes.ipynb delete mode 100644 docs/_sources/ch-matplotlib/matplotlib-intro.ipynb delete mode 100644 docs/_sources/ch-matplotlib/matplotlib-other-parameters.ipynb delete mode 100644 docs/_sources/ch-matplotlib/matplotlib-plot-types.ipynb delete mode 100644 docs/_sources/ch-numpy/index.md delete mode 100644 docs/_sources/ch-numpy/ndarray-slicing-index.ipynb delete mode 100644 docs/_sources/ch-numpy/ndarray.ipynb delete mode 100644 docs/_sources/ch-numpy/numpy-intro.ipynb delete mode 100644 docs/_sources/ch-numpy/random.ipynb delete mode 100644 docs/_sources/ch-pandas/data-preprocessing.ipynb delete mode 100644 docs/_sources/ch-pandas/dataframe-groupby.ipynb delete mode 100644 docs/_sources/ch-pandas/dataframe-merge-concat.ipynb delete mode 100644 docs/_sources/ch-pandas/dataframe-pivot-melt.ipynb delete mode 100644 docs/_sources/ch-pandas/dataframe-slicing.ipynb delete mode 100644 docs/_sources/ch-pandas/index.md delete mode 100644 docs/_sources/ch-pandas/pandas-intro.md delete mode 100644 docs/_sources/ch-pandas/series-dataframe.ipynb delete mode 100644 docs/_sources/index.md delete mode 100644 docs/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css delete mode 100644 docs/_sphinx_design_static/design-tabs.js delete mode 100644 docs/_static/_sphinx_javascript_frameworks_compat.js delete mode 100644 docs/_static/basic.css delete mode 100644 docs/_static/check-solid.svg delete mode 100644 docs/_static/clipboard.min.js delete mode 100644 docs/_static/copy-button.svg delete mode 100644 docs/_static/copybutton.css delete mode 100644 docs/_static/copybutton.js delete mode 100644 docs/_static/copybutton_funcs.js delete mode 100644 docs/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css delete mode 100644 docs/_static/design-tabs.js delete mode 100644 docs/_static/doctools.js delete mode 100644 docs/_static/documentation_options.js delete mode 100644 docs/_static/file.png delete mode 100644 docs/_static/images/logo_binder.svg delete mode 100644 docs/_static/images/logo_colab.png delete mode 100644 docs/_static/images/logo_deepnote.svg delete mode 100644 docs/_static/images/logo_jupyterhub.svg delete mode 100644 docs/_static/jquery-3.6.0.js delete mode 100644 docs/_static/jquery.js delete mode 100644 docs/_static/language_data.js delete mode 100644 docs/_static/locales/ar/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ar/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/bg/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/bg/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/bn/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/bn/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/ca/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ca/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/cs/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/cs/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/da/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/da/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/de/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/de/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/el/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/el/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/eo/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/eo/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/es/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/es/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/et/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/et/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/fi/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/fi/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/fr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/fr/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/hr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/hr/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/id/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/id/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/it/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/it/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/iw/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/iw/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/ja/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ja/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/ko/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ko/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/lt/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/lt/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/lv/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/lv/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/ml/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ml/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/mr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/mr/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/ms/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ms/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/nl/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/nl/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/no/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/no/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/pl/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/pl/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/pt/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/pt/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/ro/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ro/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/ru/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ru/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/sk/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/sk/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/sl/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/sl/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/sr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/sr/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/sv/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/sv/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/ta/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ta/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/te/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/te/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/tg/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/tg/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/th/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/th/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/tl/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/tl/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/tr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/tr/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/uk/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/uk/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/ur/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/ur/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/vi/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/vi/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/zh_CN/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo delete mode 100644 docs/_static/locales/zh_TW/LC_MESSAGES/booktheme.po delete mode 100644 docs/_static/logo.png delete mode 100644 docs/_static/minus.png delete mode 100644 docs/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css delete mode 100644 docs/_static/plus.png delete mode 100644 docs/_static/pygments.css delete mode 100644 docs/_static/sbt-webpack-macros.html delete mode 100644 docs/_static/scripts/bootstrap.js delete mode 100644 docs/_static/scripts/bootstrap.js.LICENSE.txt delete mode 100644 docs/_static/scripts/bootstrap.js.map delete mode 100644 docs/_static/scripts/pydata-sphinx-theme.js delete mode 100644 docs/_static/scripts/pydata-sphinx-theme.js.map delete mode 100644 docs/_static/scripts/sphinx-book-theme.js delete mode 100644 docs/_static/scripts/sphinx-book-theme.js.map delete mode 100644 docs/_static/searchtools.js delete mode 100644 docs/_static/sphinx-thebe.css delete mode 100644 docs/_static/sphinx-thebe.js delete mode 100644 docs/_static/styles/bootstrap.css delete mode 100644 docs/_static/styles/bootstrap.css.map delete mode 100644 docs/_static/styles/pydata-sphinx-theme.css delete mode 100644 docs/_static/styles/pydata-sphinx-theme.css.map delete mode 100644 docs/_static/styles/sphinx-book-theme.css delete mode 100644 docs/_static/styles/theme.css delete mode 100644 docs/_static/togglebutton.css delete mode 100644 docs/_static/togglebutton.js delete mode 100644 docs/_static/underscore-1.13.1.js delete mode 100644 docs/_static/underscore.js delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/LICENSE.txt delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/css/all.min.css delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/js/all.min.js delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/js/all.min.js.LICENSE.txt delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf delete mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 delete mode 100644 docs/_static/webpack-macros.html delete mode 100644 docs/ch-matplotlib/index.html delete mode 100644 docs/ch-matplotlib/matplotlib-coding-styles.html delete mode 100644 docs/ch-matplotlib/matplotlib-data.html delete mode 100644 docs/ch-matplotlib/matplotlib-figure-axes.html delete mode 100644 docs/ch-matplotlib/matplotlib-intro.html delete mode 100644 docs/ch-matplotlib/matplotlib-other-parameters.html delete mode 100644 docs/ch-matplotlib/matplotlib-plot-types.html delete mode 100644 docs/ch-numpy/index.html delete mode 100644 docs/ch-numpy/ndarray-slicing-index.html delete mode 100644 docs/ch-numpy/ndarray.html delete mode 100644 docs/ch-numpy/numpy-intro.html delete mode 100644 docs/ch-numpy/random.html delete mode 100644 docs/ch-pandas/data-preprocessing.html delete mode 100644 docs/ch-pandas/dataframe-groupby.html delete mode 100644 docs/ch-pandas/dataframe-merge-concat.html delete mode 100644 docs/ch-pandas/dataframe-pivot-melt.html delete mode 100644 docs/ch-pandas/dataframe-slicing.html delete mode 100644 docs/ch-pandas/index.html delete mode 100644 docs/ch-pandas/pandas-intro.html delete mode 100644 docs/ch-pandas/series-dataframe.html delete mode 100644 docs/datasets/sales/sales.csv delete mode 100644 docs/datasets/student-score/score.csv delete mode 100644 docs/datasets/student-score/student.csv delete mode 100644 docs/genindex.html delete mode 100644 docs/index.html delete mode 100644 docs/objects.inv delete mode 100644 docs/search.html delete mode 100644 docs/searchindex.js delete mode 100644 requirements-dev.txt create mode 100644 requirements-web.txt diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..667d8a29 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,37 @@ +name: Deploy + +on: + push: + tags: + - '*' + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.11"] + + steps: + - uses: actions/checkout@v3 + - name: Set up Python envs + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install -r requirements-web.txt + - name: Build website + run: sphinx-build -b html ./ ./_build/html + - name: Install SSH Key + uses: shimataro/ssh-key-action@v2 + with: + key: ${{ secrets.SSH_PRIVATE_KEY }} + known_hosts: unnecessary + - name: Adding Known Hosts + run: ssh-keyscan -p ${{ secrets.REMOTE_PORT }} -H ${{ secrets.REMOTE_HOST }} >> ~/.ssh/known_hosts + + - name: Deploy with rsync + run: rsync -avz _build/html/* ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }}:/var/www/python-data-science/ diff --git a/.gitignore b/.gitignore index 9cc30d1a..09a7c8cc 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,4 @@ _build/* test*.md run.sh .idea -env - -.github/workflows/deploy.yml \ No newline at end of file +env \ No newline at end of file diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 4d8466aa..00000000 --- a/_config.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Book settings -# Learn more at https://jupyterbook.org/customize/config.html - -title: Python 数据科学实战 -author: 鲁蔚征 -logo: logo.png - -# Force re-execution of notebooks on each build. -# See https://jupyterbook.org/content/execute.html -execute: - execute_notebooks: cache - -# Define the name of the latex output file for PDF builds -latex: - latex_documents: - targetname: book.tex - -# Add a bibtex file so that we can create citations -bibtex_bibfiles: - - references.bib - -# Information about where the book exists on the web -repository: - url: https://github.com/godaai/python-data-science # Online location of your book - path_to_book: docs # Optional path to your book, relative to the repository root - branch: main # Which branch of the repository should be used when creating links (optional) - -# only build files that are specified in the TOC -only_build_toc_files: true - -# Add GitHub buttons to your book -# See https://jupyterbook.org/customize/config.html#add-a-link-to-your-repository -html: - use_issues_button: true - use_repository_button: true - -sphinx: - config: - bibtex_reference_style: author_year # or label, super, \supercite - numfig_format: {'figure': '图 %s', 'table': '表 %s', - 'code-block': '代码片段 %s', 'section': '章节 %s'} diff --git a/_toc.yml b/_toc.yml index 4fe48573..f06091d9 100644 --- a/_toc.yml +++ b/_toc.yml @@ -1,37 +1,30 @@ -# Table of contents -# Learn more at https://jupyterbook.org/customize/toc.html - -format: jb-book root: index -parts: - - caption: 数据处理与计算 - numbered: true - chapters: - - file: ch-numpy/index - sections: - - file: ch-numpy/numpy-intro - - file: ch-numpy/ndarray - - file: ch-numpy/ndarray-slicing-index - - file: ch-numpy/random - - - file: ch-pandas/index - sections: - - file: ch-pandas/pandas-intro - - file: ch-pandas/series-dataframe - - file: ch-pandas/dataframe-slicing - - file: ch-pandas/data-preprocessing - - file: ch-pandas/dataframe-groupby - - file: ch-pandas/dataframe-merge-concat - - file: ch-pandas/dataframe-pivot-melt - - - caption: 数据可视化 - numbered: true - chapters: - - file: ch-matplotlib/index - sections: - - file: ch-matplotlib/matplotlib-intro - - file: ch-matplotlib/matplotlib-figure-axes - - file: ch-matplotlib/matplotlib-data - - file: ch-matplotlib/matplotlib-other-parameters - - file: ch-matplotlib/matplotlib-coding-styles - - file: ch-matplotlib/matplotlib-plot-types \ No newline at end of file +subtrees: +- numbered: 2 + entries: + - file: ch-numpy/index + entries: + - file: ch-numpy/numpy-intro + - file: ch-numpy/ndarray + - file: ch-numpy/ndarray-slicing-index + - file: ch-numpy/random + - file: ch-pandas/index + entries: + - file: ch-pandas/pandas-intro + - file: ch-pandas/series-dataframe + - file: ch-pandas/dataframe-slicing + - file: ch-pandas/data-preprocessing + - file: ch-pandas/dataframe-groupby + - file: ch-pandas/dataframe-merge-concat + - file: ch-pandas/dataframe-pivot-melt + - file: ch-matplotlib/index + entries: + - file: ch-matplotlib/intro + - file: ch-matplotlib/figure-axes + - file: ch-matplotlib/data + - file: ch-matplotlib/other-parameters + - file: ch-matplotlib/coding-styles + - file: ch-matplotlib/plot-types + - file: ch-plotly/index + entries: + - file: ch-plotly/intro \ No newline at end of file diff --git a/build.sh b/build.sh index d092f7a4..7882f655 100644 --- a/build.sh +++ b/build.sh @@ -2,10 +2,4 @@ set -e -jupyter-book build ./ - -rm -rf docs -mkdir docs -touch docs/.nojekyll -cp -r datasets ./docs/ -rsync -a _build/html/* ./docs/ \ No newline at end of file +sphinx-build -b html ./ ./_build/html \ No newline at end of file diff --git a/ch-matplotlib/matplotlib-coding-styles.ipynb b/ch-matplotlib/coding-styles.ipynb similarity index 100% rename from ch-matplotlib/matplotlib-coding-styles.ipynb rename to ch-matplotlib/coding-styles.ipynb diff --git a/ch-matplotlib/matplotlib-data.ipynb b/ch-matplotlib/data.ipynb similarity index 100% rename from ch-matplotlib/matplotlib-data.ipynb rename to ch-matplotlib/data.ipynb diff --git a/ch-matplotlib/matplotlib-figure-axes.ipynb b/ch-matplotlib/figure-axes.ipynb similarity index 99% rename from ch-matplotlib/matplotlib-figure-axes.ipynb rename to ch-matplotlib/figure-axes.ipynb index 56c68199..1464909b 100644 --- a/ch-matplotlib/matplotlib-figure-axes.ipynb +++ b/ch-matplotlib/figure-axes.ipynb @@ -4,6 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "(matplotlib-figure-axes)=\n", "# `Figure` 和 `Axes`" ] }, diff --git a/ch-matplotlib/matplotlib-intro.ipynb b/ch-matplotlib/intro.ipynb similarity index 100% rename from ch-matplotlib/matplotlib-intro.ipynb rename to ch-matplotlib/intro.ipynb diff --git a/ch-matplotlib/matplotlib-other-parameters.ipynb b/ch-matplotlib/other-parameters.ipynb similarity index 100% rename from ch-matplotlib/matplotlib-other-parameters.ipynb rename to ch-matplotlib/other-parameters.ipynb diff --git a/ch-matplotlib/matplotlib-plot-types.ipynb b/ch-matplotlib/plot-types.ipynb similarity index 100% rename from ch-matplotlib/matplotlib-plot-types.ipynb rename to ch-matplotlib/plot-types.ipynb diff --git a/ch-plotly/index.md b/ch-plotly/index.md new file mode 100644 index 00000000..1a94fec2 --- /dev/null +++ b/ch-plotly/index.md @@ -0,0 +1,6 @@ +# Plotly + +本节主要讲解如何使用 Plotly 进行数据可视化。 + +```{tableofcontents} +``` \ No newline at end of file diff --git a/ch-plotly/intro.ipynb b/ch-plotly/intro.ipynb index c4497884..21db21b8 100644 --- a/ch-plotly/intro.ipynb +++ b/ch-plotly/intro.ipynb @@ -6,25 +6,24 @@ "source": [ "# Plotly 简介\n", "\n", - "Plotly 是一个用于创建$\\textbf{交互性}$可视化图表的 Python 库。它支持多种图表类型,包括散点图、线图、条形图、饼图、3D 图等,并且提供了丰富的交互性功能,使用户能够在图表上进行缩放、平移、旋转等操作,也支持悬停显示信息、点击事件等。\n", + "Plotly 是一个用于创建**交互性**可视化图表的 Python 库。它支持多种图表类型,包括散点图、线图、条形图、饼图、3D 图等,并且提供了丰富的交互性功能,使用户能够在图表上进行缩放、平移、旋转等操作,也支持悬停显示信息、点击事件等。\n", "\n", "它是 Matplotlib 画图库的一个补充,有以下一些区别:\n", "\n", - "- 使用 Matplotlib 需要较多的代码来创建和定制图表,需要显式地指定图表的各个部分,如标题、轴标签等;Plotly 是一个交互式的绘图库,可以用较少的代码生成交互式图表。\n", + "- Plotly 生成的图表是交互式的;默认情况下,Matplotlib 生成的图表通常是静态的,缺乏交互性,不如 Plotly 易用和直观。\n", "\n", - "- 默认情况下,Matplotlib 生成的图表通常是静态的,缺乏交互性。虽然可以通过一些插件或工具实现一些交互性,但不如 Plotly 易用和直观。\n", + "- 使用 Matplotlib 需要较多的代码来创建和定制图表,需要显式地指定图表的各个部分,如标题、Axes 等;Plotly 可以用较少的代码生成交互式图表。\n", "\n", - "- Matplotlib 是一个功能强大的通用绘图库,支持许多图表类型,包括线图、散点图、柱状图等;Plotly 同时提供一些 Matplotlib 不太容易实现的高级图表类型,如3D图表、地理图表等。\n", + "- Plotly 同时提供一些 Matplotlib 不太容易实现的高级图表类型,如3D图表、地理图表等。\n", "\n", "## 安装库和导入包\n", "\n", - "使用 `pip` 安装:\n", - "\n" + "使用 `pip` 安装:" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -32,51 +31,28 @@ "output_type": "stream", "text": [ "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple\n", - "Requirement already satisfied: plotly in /Users/xu/anaconda3/envs/pyds/lib/python3.11/site-packages (5.18.0)\n", - "Requirement already satisfied: tenacity>=6.2.0 in /Users/xu/anaconda3/envs/pyds/lib/python3.11/site-packages (from plotly) (8.2.3)\n", - "Requirement already satisfied: packaging in /Users/xu/anaconda3/envs/pyds/lib/python3.11/site-packages (from plotly) (23.2)\n" + "Requirement already satisfied: plotly in /Users/luweizheng/miniconda3/envs/pyds/lib/python3.11/site-packages (5.18.0)\n", + "Requirement already satisfied: kaleido in /Users/luweizheng/miniconda3/envs/pyds/lib/python3.11/site-packages (0.2.1)\n", + "Requirement already satisfied: tenacity>=6.2.0 in /Users/luweizheng/miniconda3/envs/pyds/lib/python3.11/site-packages (from plotly) (8.2.3)\n", + "Requirement already satisfied: packaging in /Users/luweizheng/miniconda3/envs/pyds/lib/python3.11/site-packages (from plotly) (23.2)\n" ] } ], "source": [ "## 安装包\n", - "!pip install plotly -i https://pypi.tuna.tsinghua.edu.cn/simple" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple\n", - "Requirement already satisfied: kaleido in /Users/xu/anaconda3/envs/pyds/lib/python3.11/site-packages (0.2.1)\n" - ] - } - ], - "source": [ - "!pip install -U kaleido -i https://pypi.tuna.tsinghua.edu.cn/simple" + "!pip install plotly kaleido -i https://pypi.tuna.tsinghua.edu.cn/simple" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "如下所示,导入 Plotly (并导入其他相关库):\n", - "\n", - "```{note}\n", - "plotly.graph_object 模块包含了用于创建图表的类和方法,而使用as go的别名后,可以使用更简洁的go来调用这些类和方法,使得代码更为简洁。\n", - "\n", - "plotly.express 是一种更高级的 api 接口,通常需要更少的代码,因为它使用了一些默认设置,而且很多配置都是隐式的,适用于快速创建简单图表,而 plotly.graph_objects 更适合需要更多控制和自定义的情况。\n", - "```" + "如下所示,导入 Plotly (并导入其他相关库):" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -86,6 +62,15 @@ "import pandas as pd" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`plotly.graph_object` 模块包含了用于创建图表的类和方法,使用 `import plotly.graph_objects as go` 的别名后,可以使用更简洁的缩写 `go` 来调用这些类和方法,使得代码更为简洁。\n", + "\n", + "`plotly.express` 是一种更高级的 API 接口,使用了一些默认设置,用户通常需要更少的代码就可以完成很多工作:因为 `plotly.express` 很多配置都是隐式的,适用于快速创建简单图表,而 `plotly.graph_objects` 更适合需要更多控制和自定义的情况。" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -94,14 +79,14 @@ "\n", "Plotly 的绘图通常遵循一定的步骤和格式。以下是一个简单的示例,展示了创建一个基本折线图的流程:\n", "\n", - "### 类似于 Matplotlib,首先创建 `Figure` 对象。\n", + "### 创建 `Figure` 对象\n", "\n", - "使用 `go.Figure()` 创建一个 `Figure` 对象,它是 Plotly 绘图的基础。可以选择添加一些初始布局信息(用`.update_layout()`方法添加,后续详细说明)。" + "类似于 Matplotlib,首先需要 创建一个 `Figure` 对象:`go.Figure()`。`Figure` 对象,它是 Plotly 绘图的基础。可以选择添加一些初始布局信息,比如用 `.update_layout()` 方法添加,后续会详细说明这些方法的使用方式。" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -936,12 +921,8 @@ } ], "source": [ - "## 折线图数据\n", - "x_data = [1, 2, 3, 4]\n", - "y_data = [10, 11, 12, 13]\n", - "\n", "fig = go.Figure()\n", - "fig\n" + "fig" ] }, { @@ -949,17 +930,19 @@ "metadata": {}, "source": [ "### 添加轨迹 `trace`\n", - "```{note}\n", - "在 Plotly 中,trace 是一个基本的绘图元素,用于描述图表中的数据和其样式。\n", - "```\n", - "使用 `add_trace` 方法向 `Figure` 对象添加具体的图表,比如散点图、折线图等(可以在一张图上添加多个)。\n", "\n", - "该例使用 `go.Scatter()` 表示作散点图或折线图:`x=x_data`指定了图表的x轴数据;`y=y_data`指定了图表的y轴数据;`mode='lines+markers'`设置了 `trace` 的模式,在这里,它设置为 lines+markers,表示想要在图表上同时显示线和标记;`name='My Line'`为这条 `trace` 分配一个名称。当在一个图表中有多个 `trace` (即多组数据多组图表)时,`name` 参数可以便于作出图例。" + ":::{note}\n", + "在 Plotly 中,`trace` 是一个基本的绘图元素,用于描述图表中的数据和其样式。\n", + ":::\n", + "\n", + "使用 `.add_trace()` 方法向 `Figure` 对象添加具体的图表,比如散点图、折线图等(可以在一张图上添加多个)。\n", + "\n", + "`go.Scatter()` 表示作散点图或折线图。`x=x_data` 指定了 x 轴数据;`y=y_data` 指定了 y 轴数据;`mode='lines+markers'` 设置了 `trace` 的模式,这里设置为 `lines+markers`,表示想要在图表上同时显示线和标记;`name='My Line'` 为这条 `trace` 分配一个名称。当在一个图表中有多个 `trace` (即多组数据多组图表)时,`name` 参数方便作出图例。" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -1812,11 +1795,10 @@ } ], "source": [ - "fig.add_trace(go.Scatter(x=x_data, y=y_data, mode='lines+markers', name='My Line'))\n", - "# fig.add_trace(go.Scatter(x=x_data, y=y_data, mode='markers', name='My Line'))\n", - "# fig.add_trace(go.Scatter(x=x_data, y=y_data, mode='lines', name='My Line'))\n", + "x_data = [1, 2, 3, 4]\n", + "y_data = [10, 11, 12, 13]\n", "\n", - "\n" + "fig.add_trace(go.Scatter(x=x_data, y=y_data, mode='lines+markers', name='My Line'))\n" ] }, { @@ -1824,12 +1806,12 @@ "metadata": {}, "source": [ "### 更新布局信息\n", - "使用 `update_layout` 方法更新图表的布局信息,包括标题、坐标轴标签等。" + "使用 `.update_layout()` 方法更新图表的布局信息,包括标题、坐标轴标签等。" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -2695,7 +2677,7 @@ } ], "source": [ - "fig.update_layout(title='My Plot', xaxis_title='X-Axis', yaxis_title='Y-Axis')\n" + "fig.update_layout(title='My Plot', xaxis_title='X-Axis', yaxis_title='Y-Axis')" ] }, { @@ -2709,7 +2691,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -3575,14 +3557,21 @@ } ], "source": [ - "fig.show()\n", - "# import kaleido\n", - "# fig.write_image(\"/Users/xu/Desktop/plotly_figure.png\")" + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 金融数据可视化案例\n", + "\n", + "下面是一个金融时间序列数据可视化案例:" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -4973,16 +4962,13 @@ } ], "source": [ - "import pandas as pd\n", - "import plotly.graph_objects as go\n", - "\n", - "# 生成模拟的金融时间序列数据\n", + "# 模拟生成金融时间序列数据\n", "date_rng = pd.date_range(start='2022-01-01', end='2022-12-31', freq='B')\n", "data = pd.DataFrame(date_rng, columns=['date'])\n", "data['price'] = 100 + (pd.Series(range(len(date_rng))) + pd.Series(range(len(date_rng))) * 0.1).cumsum()\n", "data['returns'] = data['price'].pct_change()\n", "\n", - "# 创建折线图\n", + "# 创建 Figure\n", "fig = go.Figure()\n", "\n", "# 基础绘图 - 价格走势\n", @@ -5000,12 +4986,19 @@ ")\n", "\n", "# 显示图表\n", - "fig.show()\n" + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "一个金融 OHLC(Open High Low Close)蜡烛图:" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -5882,9 +5875,7 @@ } ], "source": [ - "import plotly.graph_objects as go\n", - "\n", - "# 模拟蜡烛图数据\n", + "# 模拟生成蜡烛图数据\n", "candle_data = {\n", " 'date': ['2022-01-01', '2022-01-02', '2022-01-03'],\n", " 'open': [150, 155, 160],\n", @@ -5900,7 +5891,7 @@ " close=candle_data['close'])])\n", "\n", "fig.update_layout(title='股票蜡烛图', xaxis_title='日期', yaxis_title='价格')\n", - "fig.show()\n" + "fig.show()" ] } ], @@ -5920,7 +5911,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.11.7" } }, "nbformat": 4, diff --git a/conf.py b/conf.py new file mode 100644 index 00000000..d6484044 --- /dev/null +++ b/conf.py @@ -0,0 +1,48 @@ +author = 'Weizheng Lu' +bibtex_bibfiles = ['references.bib'] +bibtex_reference_style = 'author_year' +comments_config = {'hypothesis': False, 'utterances': False} +copyright = '2023-2024' +exclude_patterns = ['**.ipynb_checkpoints', '.DS_Store', 'Thumbs.db', '_build'] +extensions = ['sphinx_togglebutton', 'sphinx_copybutton', 'myst_nb', 'jupyter_book', 'sphinx_thebe', 'sphinx_comments', 'sphinx_external_toc', 'sphinx.ext.intersphinx', 'sphinx_design', 'sphinx_book_theme', 'sphinxcontrib.bibtex', 'sphinx_jupyterbook_latex'] +external_toc_exclude_missing = True +external_toc_path = '_toc.yml' +html_baseurl = '' +html_favicon = '' +html_logo = 'logo.png' +html_sourcelink_suffix = '' +html_theme = 'sphinx_book_theme' +html_theme_options = { + 'search_bar_text': '搜索...', + 'launch_buttons': {'notebook_interface': 'classic', 'binderhub_url': '', 'jupyterhub_url': '', 'thebe': False, 'colab_url': ''}, + 'path_to_docs': 'docs', + 'repository_url': 'https://github.com/godaai/python-data-science', + 'repository_branch': 'main', + 'extra_footer': '', + 'home_page_in_toc': True, + 'announcement': "如果你觉得内容对你有帮助,请在 GitHub 上点个 star 吧!", + 'analytics': {'google_analytics_id': ''}, + 'use_repository_button': True, + 'use_edit_page_button': False, + 'use_issues_button': False, + "toc_title": "本节目录", +} +html_title = 'Python 数据科学实战' +html_js_files = ['https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js'] +suppress_warnings = ["mystnb.unknown_mime_type"] +latex_engine = 'pdflatex' +myst_enable_extensions = ['colon_fence', 'dollarmath', 'linkify', 'substitution', 'tasklist'] +myst_url_schemes = ['mailto', 'http', 'https'] +nb_execution_allow_errors = False +nb_execution_cache_path = '' +nb_execution_excludepatterns = [] +nb_execution_in_temp = False +nb_execution_mode = 'off' +nb_execution_timeout = 30 +nb_output_stderr = 'show' +numfig = True +numfig_format = {'figure': '图 %s', 'table': '表 %s', 'code-block': '代码片段 %s', 'section': '章节 %s'} +pygments_style = 'sphinx' +suppress_warnings = ['myst.domains'] +use_jupyterbook_latex = True +use_multitoc_numbering = True diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/_images/0293520e5f5f443ee51e5709c66b948b0a78e3c44d5f3315310760f260236881.png b/docs/_images/0293520e5f5f443ee51e5709c66b948b0a78e3c44d5f3315310760f260236881.png deleted file mode 100644 index 61daed20e172f662748eaa527d4b4a149448c775..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18306 zcmcJ12UJt*wr&6wE8tc{Km-+$BB0Wgsv;mFy-8P5dXp+08z@DTszK?!BQ;bNMG-;` zAiW0&5TqGGC~q#@XS>h2_nmX^8{_Ta28ETCfBpZg-}lWtQ&Umcx0_`*3WeIIc=d_~ z3PnXip{V!m+yOs15h3~+zFlyZyWy;9Z|3ZF%keHs`IfVTjlHvtOKwtG~1njoH0t&-%i~ z#q(sJ9M|biQ}VZW0uGv5ma zR)%W>L@Zi3mS?)#lb@n@L^#Ic8i?M35m6*(vj;Bd|DCUBi1%{y1=;*m+7rTT9Dgb!jRvC`dE( zs8o^9`l?4>Z>4*o|6bB*{b$dfS#{;UjrCek)YjFV9u8pFxqSJdhK7bfX0O6g_ba+4-o-s7wpo06l^UT^ zKVLPym6&k%8UFaB{AZ8#@7tC16P z=%}bvw?S{+L9fLSP+B&ET|bPgO=sdzW9kcI{4KH~cAb82-3plnBH>_~?Z>6Z7PUoB z6eADybGA2adAiGbb7TD*7HjJ)R4KMdoiO57LwO6<7tbc)YSHxO0{VheDiJerbp1zw z435}e;nHhcI#o>}w!aoK=T!XioUI+UKlj5UTI=RmDY#F^ySoibStje>7GvpU*78N| z2eON;y9l-PGPqRbm?GFWdDHJ0r!@J{qdCY{flUimuOt#{HaCLMKVZWXW9-Tmr974_ zma0VU`qD?ggjzR5@#_~^ygYRJM*O|ex~V|E+!k2;@_QQkNpl&>>*q(M2=2;;hHrGT zZzOnAeoj4MGHz*0QCePGZ0_l5EWOC8+aA3gr!7~049mw!dk6RQ=rpud;iiAz~hNSy@>juU;J< zg%eu5?j-)!pVM@@GY4K;SF=f}VXg95&eU~MiaLGvwy9|d8qJcFo!$8K`E$_$uSMnN z#m$v3GQpy@J%^npnwGCCDJcoX`fj*4udK|EhGb`-ZeA%c{Sy53>s3?A&sn&qytZ~^ zYl1AT>E}Sk5PW!K`^8Z#EWUHnAeJfDX|YzrzBW)=ll^mQ!w+`3D_nX!zDLIjG=stsBJL4^ve4K_P1{* z4m)B9Rj?sWArQ*CVxpp=%&xya_gTo8gpvID-89zHpwv!;lUXIL{mkCl`{R+idjo1) zEn;=vqbr`Qx67=DLy$K2nrul}9SIWD($q{cs&M5I64Hck+F(BZ^y~tPtAwmPPDLT} zCS0a=mh)_J7h!X~W;0Dynw;D^eqTtCfp?WOH|KtYnK=V&aGF+T<$<|Atc}y%)qHla z#ssV_N7t#=f1jqiI|eK>6N#=6YQ_2-9!-!RKi;-X=xE3)3kweyah0At+MefR*&2OsLuV+WA8a-zs#(Kip3fp`?gGAkef&!1FRt2fS{Vr{7 zZ35yd7sGV&jB`xZMwnJ7lR_m21;dKWn~y@=zIyN8JtSa)J^%5?A6j~P8L$>lJmmwu zPs`XkiOEODC9WYwI?Lgr6TNI?WF(7-RRoyka*uVMCAfutp;-v0yJ%1dvyi-r4>`qW zKFDMeETMcn%7CTcc^q4LG2NmgQ@iS33|7Zp-{?SIPR>3Hc%1OKwJTXVIc?pA=F8vs z@+?L^J+ta9nLTOZgz+Mzc8nLgOzR-7S32lZ(V1hA)+|lAUb8kXIBhE)tu^;`V~>$r zzYF1eK~j{U3GqUwLfE&41|)GY9y-*?y79BLX6g&1p1Xr2M@)yez=s9B*H7?vw|YzM z^Teucdqp9?Y0}aiX@P6#rPi0)uc@l)&J9$tuF3Tlm?}VqnCj3q=@|JOwA?$mQPO(X zT}bezocHQdE39Q&@vWviDw!V1r%OP5SHz8I z=rY@*4LN&tZgazaeQY5A9AdG z&6J->%kHK2`SWMAkoj}EBj@8GCR=@YxE*GV(2T8rWyp4_14uPNfNo7jub=>vwl| z69#K)?8>LOm*2-CoUYdpbJo;9Gc!}zd)3(_MXfp1XX(WH2vbeVOn0FR5)i^w zrCXsS!Y@;n2pvkSVs^N1k$lTY$pL1b1BpEmDm|-@k9QH;(?ZP}UnP9|b`2^$%CYdE ztt^VH;@N>ynNTfx;9r|lzw5jBj+x0$mKyc=G320r#|D000fC=K&g{TJHF|O9J&fTh zKE@t$KnfHho&tMm44+~bPz;xKat$-U=-x_u_k_iS53^=()vmw3{;h)Dw&p`DE-n`L zSt}bE86g-wV)k>}TdSt0_Zp&5jLWfziwStDK})NC+DZ(&jE`YPM#cl<(>L|NT&^i9 zo|OoeS6}p-Gs-2>4D^kTjBsLT_TW06qWF0E`L&^1O-p^qC_=xYqB$)+gsrkGH1zV4 zd_uQ!G2fn$3iqur?5CZ3E{;OAoZea!*HFy(Jxh^df7c^qol_0G9Xz?k{?4jucdj_t zyKZl}EFz+D>A{#Yyt9T!`9Wq&SFN45gh?D>n;1>i%2L&)uxrgloC?GV|cse$8C!vm#>-@dcF9%*_ZJ;kC@x_{p8dY#T2vZaszUl zgmU1o7r6}@)f6bT6_^sI+}-h?p1e?SqNj$H#oo7%V<~^6+Fx{Ppf?SzPn@T@A+H?b z8B&$t>DHkPCAJj%&`Go>!}oh*y+NJd1@BySjMB3D^3tA$=^$#8m%HqK$oggfV~k7{ z6Eu}q;HIYX>6v8D zhhax@I==6+7sZ64+1sR!y|_j7BW=lFWZ7sIuA$k#NM)Rep?&amXUw5HKO>Wa zSiJgI9yV6LnWMX*cqf_SET&jTVuhcLe10?c+$;e@`wVs~LgH?`_~+hf<+&M)oIW0! z3(ai#iMtLYcVyk=bjy&DIw_}Lg6 z@O3e_)+m?MOnqe^LfopTxh)4!xm- z5k!3`yw#Exzt6gM&;FE;+pI?G%St@=$_l?5NjTVrj!8pZ!aKUm*`Y`58#2uKM4KGY?6XLIL)!%cD;wa<9adoAf z7#V#E`<9PQ%EL$hTHw;hJ$=nbEV%N1Vq}(DWP6|k3k(cgsy`Js*(5Qi1@WIt8I2pc zxFF+Zh0m&(7I9S+SJyz?N@ruD>5w3eA8AdG^sOPBSY6>`8l7zVrLTQ)LBD!0$6oi2 zKIrT+6~nnQbn}eMNdul8)!v@Ay(P*J%x%;e{^4sqWD~L3XQZDQsU_V3v?vQM-;OFP zt3K?t-zB#wj z?!M->!^OlJ_FSK&M5lH*b~g+2lyv_rvEuG` zn|DUvhinHsRuSK%vtDe^h`&^zXB;L^QqmwsJRlr2*&Jbd%a#)f-YQbl=QsCwHY5H3 z*VQcDhO0ykUyo~nMIIs(nA)DT`@9w{!fy5bLo%^4eL~f@S8uM*oj74JlV6lC!|42R zo3_urtDBNjU90Z++RU{drc+<{vq)rPo6{cd&~}Q}vTv_QA&F5B&f~Sz8UllHCAsU% zc7wy2Y|?L(=kulQRkqvu$6FIGmJMsEaqK0NwbalOH_xeT-~RDMoa*)z3=LP71Y=PF zn;H_QCbZPvUnZz*FBZ`ti^fEtduB8*SrYx~;YX3q>W`3LCnA5p<5ly4GKAcUVcU7e zgF9t?BpHRd1#Z*4?;i?So{VQdy`~mM(P~+WWz#dI&9;H3c+Q+fF+Z)5wxH=@*2G&|>znp&zLj8q?i5 zgoP_G&}C@Wkg@i-8edWddAEp(g&1qHjt>cbKE!sy;-#_H$0F1|>>KWJ&o z#!Fjwo<{mVD07xvBvB6;MCczM%A4C=YSqCzJ5XgH0boqqnn1LYKy-tUvA#ZG_Bhq6 zr)b*Cp}N*Yq%?y<2kA-tFNzrSv&k=FC=5^?t>SH;QcKYGBI;K#Y(4CV{z{v z&@eJGra%a^9jMepI%xP0S{kQT>vx5PfRT(aLlNtJND{S~2+JD--!ZVm$U*y^BW4R_ zApv6SQTMU^a-t58+$;J8D*6ZBaZ|l|2+IlA#YzbXsI0FpXNmE1ammm2meyE^`?V-w zX%e2nz5_gF%+9~*4XxS2rNgMp+ePTN$#ni-P_p0K&M(bK_ao(>0-8SJXXieex!ypn zWu(gUa=&<^!o#C@O*NXOZ1ouWIsSS4%m0}66+&a{dg#R>!JI-C+9^QPH-c! z58SZJdM3;{F%q(5h^`7M{+j`#Kp3&|C8xr0y;d_PNCs+4pZd51zvT-VjKo`eWg zZ!v@^w?qmJk>Y(=Dh|#LTv^xmkR60_I|z(K@{kBzTRQr+lqsjc%)8@7I-6{{i8zS}--$=``?R-pGR!+uZ!clm67gRi|6EqCe zVd(oWY&0iirG(vH*`m=;^D_hAH{EP z&#Ao~nO#nGb1l+=0P|*o?ndk5U2TMpb72*@xY)4cImTFbBL90i8wOzrLT&j+*_IwX zVZRopbDcf=-}&JO7SBDcefzZpY{m>d4(&Yf@?}qFaSi9x)NrlkjP!dm_y2&R27{?V z@?EEpbiKSPq4yMl{Fh@=Ghk9cwUZihx<{oIk%xx|sr8{_5%7lZEN5>&M$j>&$Jq#^ z_p9Hk5?uDjG&VMRjH*g4M>sk;6+<6rFiwO zu{4=*>Cq0JQ>PS=Ze-73e|YIJXkK`Ec;@#)1o+!4st*k^=9ZL{3~-gr752`)>zxge zrsr5P%>1`>wm#_7o|yd;NG&GeUFo96Xnlu?Q*rl&TfLrjFuo z0X0T?BQ$2NAu7WJT^uIqApTUuzN4PgzhM<*RDbtBI94r zcg0=E$;Zd1YMzl#CtWj51-kHPq*099v4i8h8tLNXd?v=%L{ae>C(p5C39asi0@3it zyt1gM=w#5go9`Mrq(tan<#p5IIyyV81}fbVsBaZ;(@C!j7cRiA#vT(9DaIg|rs95G ziuDEqS_SYC!48y~qTjyFfvT`s&Csx~PmcPGp5|5!+Leu6C^T>G1XQu;Zo{FJ2C6D*MyMG$x6Hny&m4wVf7-Jr|Kf2HNGwu63TRt{$nx3N) z*^A+xg)MI5e{oQI|97m(|Lo3{c0_{`8+9|YROnFe7IrT|A-ZzxH0lGApF+E^Rf&n0 z5f2JGskFAA-j72TQq!q#y-ZM$%bV5(&nuk%m41)r#Z;93K2h8t9Mf^Dqi5m<>C+p2 zd+LTUC+Yz7xa75gzQW(xbG_;+iYpN+f3kOBWxri?za5Em8?|j0+<<*ztJOBn!$e0% zPq!q<#?C|9PtVU++qG*Kp{F=Y^%2cYX)DAD#Yn0$>sn%iUWMjf8*AjSWB^igZWMep ze?Ya94krmA&W^~;%zSQdEz-zbMt<^r;@=TZ|FbRplcoB9yclam1dv$0)UF>_?qc2V zP`j_Ez%(Fll$zlV*q!tJ{=Px5AZ(nB$(}=}TYwf2x%nOy!Xk1FYLg`euU{T|C@+SR zC>ONU9=D+dU6bx$wfC~j=AsOOk|5At=n85Z71$@g`aq+hwss1F#!5)^3h^I5ei?QX z2Y8(KA1`hley3Z(saR~@lwQ)4#UN{Jt1Utfui%-eYAyGa?; z22l6Yr%xX32M!!?8G8RhXe3zYRq2q)WF|Hnn)l*x#zo(QQE~Q~ z`ue;;ZvAR%X&qbrQXXI9e{${3MQ#f#se87+^ZT~7v9|ImlrkoNyI);Lhg!a2eePMD z>%0+GN{w4x6aEsT!X0})HHbh_=5M;FOIh(aBH!KGk;BWHT&Uq+#aAS}w6rke9a&vX{#uR?HfB z7Zx$QH^8rA>6-J>$v?8e^hpN&td~*|RwyJy1d!sJ*Wa9Py$}3lBOT98D0716N56E% z=%}gPyn0S0R?<>MjY`<8@o5< zmY>?<=(O^lG_=@W!hnejyR$VBEHKprdJ-T;Ex$$Z=vRBWw+yzmnE))j3}A95aJg24 z)m7cYD;>ZVWUZ}v!J{YvABrC|1Xd2`QV!!p4gpvW z{Suqk^)I(KVZ{csKYqN7)Q3QjBD6|fFmsY%&05<`%Nnm?7Y_aLOt8`buSkUY;;_L# zZt6F1D*>`KeQxjT~0?gOOqfMe}hqo9`glPTr zbuG)hITo5&afczl?u2b`p`JzvYO{c0CY;wwXXTZClWR)T(iWY4Ko2fc1~-in26{r* z=GLtQgc=?jyOU#xX`5kChM;nA|NaE1OVDhACMP*LEpX}T`tR;MAG zPMf|mb+~^A@HBT_xuq4bVy6xN+HlI!%6Kl~J1 zw?A(fZv*t3QxWKoHlY2I7Zx1vnwg=Gyx!#3dv^tbUi*tz^)C>Fsx@13-dBETA}920dp818?ylOM+0ZjJxo3#GIyv+L{OdNlSMIOH=i>d ztqT#dt6BfKBd)jFyW&{=_d;`3zogySkb`Bz%%27Y3GJXiY6HA{&rAz79(annY`wx@ zz|>EOi}y?ddoZ8GzW#LuGT0qg3m=zZb9P3?yUsJ;TMq+cP~b&&OiE3y1J8PhPQy>D zk*f1N?Z~?Uh1iCbhR`v@DokPsfB7=OeG%_oSK%_9`ZAu{rzLmg3a(-QPIEIaS})(%)$bgJFQ4S%`UX;ww{8RTWJ*9` z{DpWrY$4FJ9=fg`8{`QH2--Jp9Bxb74@jpK94bPXgTy5F(D-c-3qS;jU->}2qR&xH z1Ee)@n|yJVx`?4nKRXrMf)=q}Qr%oqEguQwLoZ8%IU{8zLTDR#&K66DoQ-JhlQjfe zo(^G`_PX(C$36{U`;`N~iUGdL2U$)9xC}&?(LId1#K$m51yzu=XP$TfJ$n>q2)oR{ zJ0{C>2V%y(IY9m3gl}xEbYFD-%&5x^!4Cq5HgsgEs&ToXD_Ndwm7VU&%OjP8Sj774 zi(}CFKyYuX0VzmF#U3@}O5oN(8gcUE$tlc4Y=uQPlU*2a+%W?_6x;O;QcX10OjAcE z3Td{0lG)58p}`j+Is+3m8RjlE|LFk2Eh0oG2nfg_pB6Vx$OpFo(Z{LCr<2`6@AHF3u`N>9 zmyc?BJi&*Bo!cI#6j0q=3^T&1Pses zoH9+WTzQ;^>6)cmS|{hs0u-VJ95%ugnl-)209sl>W^I_h*pp<}@7ilyK37d~#y2u60(0`k znKD~y{bT4uPoa4z(sTmBd_SyA%BglZlr)EG!pMGO$VBSIevVsb5v+0g-MJ06YB}pDNec zo)m<8jWV!nMY0J*A;M^=OcW;)$3cezP+M4E&CjkplRStl5D_&X>9&6_Fm+j)R7YU8 zO>*3321Fw*;F?Km$^=JO@wc(}-gjmHWOKNHgw))c4G-_1-R2%YKG2Fd;jbg>*izvj zr7>h0M6VUMxn>Tz$7*S^6-dT5S$e6lXBkA-QkVa^+J(1%o$Z(+yYE^7Xi!q@-;FWG zy~$?6gMPuT@BU~=>^x+U6I@(%Ww0NT?QjhQzH*nWTZjGUfjOR&&oi#tl9@>U{}Y06 za&jJq#2IUe!C+#)vn)VLJRBAbS(OEJBM<@3LfTdrtP$V7eY-qBKk87h+OKNs8r@yP zi`AS3rUeN;vSIhezV2^cgdXDz$g!*=qM|%fVJp8)LTgY}=CMq;J2p0UzwRWnb!WDv zut|JM_6nQBaL!eTJ3g)F(yqTAVFpox2*3w-#_)LLt$kN&*#*8~#~qmgE;);!A+=}r znnF=gM>0@@sPQr?%2iz|EiKKnZhE7HPd8T>*7E$wh1*xp!HNpy7k4RSV<=ZaGbI&z z;=~Dr&S*}(t9b4D^$5TXwChoP84`=OMyHD(Xtm@UP zYH$FRfqcMILD=kA7;iYKI9ElAg+>*WR$DrtFZ_Ic4v=-cPX)$io5OKDNDkP~xS}nF89B>lLhG5AC>1rT# z-QO8>iC~AZ^AH=BA=C}96@eH}%GaDjZOe$6@YaRhIE<6Is-5T08PN6wfG}zzV-9pH z+B!PMC3SfiJUWO#{#aw$KN!VQBTSdR_;QY2(WByQmxbb41KhzR znvso-UlF%L%GVp;{W5u34Y8cbRNCW(!r`;zV;EX;m)hkR`~tkn(a%euIFhAQ0++3>0$Yf(B?pI@sL$ z5#;X2de zM@6#)dE5e?X-gKhC<$(gNPYl3Lad0@zEU0P6|2q#M2P{KKIJ&+D#gV?5LqCbf?jP-z>Qp3{~3BGu1R74_I$WnSXu# z8;(a+bJ@t&Hs?9J3{sL2hxZiu-8#(6$EWG&=vXLV^9T3u#vabj({6BA{5TkBWLVg3 z*TW%zm~DwZDluLCtyyJd-{-oH?8ru_Z*ZGsVi;3!y8C-K;JvBri7qkYP>At3zo&iZ zttkd7l7Vr8^nEvIzx_b7fGDy1nx($ua96i)4{PT+c~Ws|O5;v)w>s62Q-q_^@=o+z z?(S`Un6@V*2^Gbc#`iCw&wQvXL#@!e(97H`^veJGiGhb$}X(bVH~c^ z7bE6OA6IUB=x_9?(fsJvWW3?{=gFt4Hzk_hp2Q(ZzRMPB$v{{2! z?}t}&o+P_UqdtU|2e7yHJ-XykPMQ2(mwWzBp<+e`k&L=Q11kW5#-p!SNtS|P!E;O= zTUrd#?i;&){U+$Y=q`+?_*Qd?wnp#{hnNa>aUI}FcWk`TFJt;rJTk6L$Von9`RQIC z42_QHt%t%slDg@SRN<|a? z^_iK;Q|k*-7io@#*@EXRB|^;P*+zc^kE8RZc{NNr+aP&20F$K(yat`QTl3D zM)p8kI}KO}4hk|*xS1F^`b0ORfQr$B#;;{WxnC0?SRi~5sU#xhMcO+&o&Zu;#Gj!; zNcuY~%1_5~ap=AQ30FzV%t|R8aHQ|(FjJu6%Lk#XFzIueYMhR~J{r+NgW^m0eCTf~ zhgU>I8@h+U&`^6~BLDPt?c!DGjR%~TgW*XyQM7lA#SKf#j3aak@2#gCT~x82d5M<; zLtJD81fy@?ZVaLQkd@&wnAp_%UnCn<7cM8K`d6Hwx-}f%#h@b5 zf&R!ovA!X^+$G$uT5okew13le8Xrr?!425^kHyS?C%;&@y2V>YJwKWwvkt_i^KP~? z+y7)iT9Xt+EZaCiSgM5NP6+LJkf$=Bw%`v+OqEAV=vrBjeEW;s7yCf|!2Ks9U{Y)q z>6^&SUA7Ya57ILFf}%$)s*{ek zwzl!*z46^!q~#z?T5{$&`PrL6S(Y+rBT8DFntBkrZ)dWD_{rdMl10Zgv?z9l`zDJF z&fCEzDl|9(+%)XYcbnz7ELM}s@8u?reg}Qh9vi8V5{dhB*R)6_jS?nJ=x+J5I6~wHp6q$`yDF<@*nUOE$_O0XQF{6&rO%hI>DgUe# z*soL5hgq{ZoSAWNQ^S7d>wG!39iZi`?S%p|(>bZ1^wjl}3Z7G+tj`#qJC%X8Jv6}9 ziV~1v^&Asuft;=dzD>iFwehFRHviznXl z_Q|CTZ3!hJ&Ty=)V2B`m=stgP?@k$?Tu;zUl$2|JtoHqMpDjlDn)1FN&5wTh!xQCc z7#cG~!|>|`7teqw0{&h=ywJRR=bU>$g_+)Qf^{JR~ zWRwM{`d7KcYUZ%wxybfc4$U%s8M@+e_(o4afSHEq<98oLTI1Blcw=ISrvA?T=G2 z;MVjO!IWz0DQmW}^6-GfwRy6bH5PFh;4V9%R&)WJU`6ye>QVr3KT3sY3LrGXAf1NF zqpfQm7?X`$GMdG5LWQKJIT|gut@zI;B6$?9frJ|-4(w(jA}Jy&FpQx<^L=pcQs99S zFXFuJrU>78O1XFb_Y+s?I|&L1bb`hlkwIqwlBMkNcRiR+Jc>FL76Kv(@2*@UarcE} zq;>-x27&=D;;~3a3yn_-dPm8rJLcwD$;qFDpoXTLzK`0F1DdKn3%gL-=NR;p*l%Fp z1AtlwK#WogUrz+u3`x7VRv5WfRNYmlJ_D+X$6R@6PvGM*(!z51a$(XL)jv17 zuo~(lQuE_`T!GZGl94cGgpfsx$woX)_rdNQ)-E_jwh}M!Y>#P8m=|`C9H&e zU1d_x%!YRo_m*J4tdgYz&GcK}BX%Fp`4R?d+2dreY3$tE3FMy2|0;KuG{jcA} zjNhsTMP+M&s6lOWuZ@OPrl&Nj^I|`R5ndG(>>T&=c>Rh`LRW~Oaie?QAsqugMn+5k z0Q5<_D)SrT%1J-IOsG03IJ`P@Nxw>8-Z6T$T~h;ulotj&Mw((H%iY}Q5fD{*=!xwH zu8MQhYhwm>1+I=Xts`tO2jMc-B4S?)UCU9p^Z2u%8;6bZtN6kbU#zo}E-E@&ktvE+ zPOQ4=);yr$Q2OT#PYWuG?7fO@4PuIkGX}w+1V+Zu{*~yXA)sCf@LmHX0z$_=Ak6X> z>1$<9_}w%uRZ@z21zYhI2$Z)qx-sKUPEH*la{}2SpR}|wQq6hjq(_@24{gggQ}t->f3A#Vls>NJCk{oyvT!Lk5j2#MkEi7_PVxj?{d!rYVc@g*`dEd2mLH7GdvNJ zw`&4Jf}98=b3Fk5B1jg%zR>jMwUV729mgEbOUeQo7eu{-;r_rDb>BR_#l0Ps@~~)$ zzx1uXz7^>%KDv>{Y_GbymH-YZDGS~6-(HdTc>>eb+1c57_JCt|5AOR zJ>g{t_74CcXiKgm%pd}VArmbo^HgV;|IFYp3nKy}LKohuTsT69%zPm_4!f#loh^?3 zK{_R!n}=_DZPY;)xUA{5Dvy}E4N+vX4Af*8vRT`e8d1 z6@$&*TJJ~!MXO$&cioL4r&_j-Tn6g>>u&hqgRIj>3DsjCcWu2462O0$dpzF^apL%i zl!`g&&GUUPWXKe8Ul@yQFSg^aT8`>ge-*G+KiEYs)cYp^NorQQgNbUdnG?jKEyIZW zw^Nmf84vGvL0xBJ=IQsLkiQK3Z{4*WNm?$}Q=z`X61x|Fy}4+^UrVk7BMlEvf-y8c zkgh=&-G(%z(4Ma%#VZGci;4QN&!5Ty9IDp1;c*2QNtqaXK=caDux%x_y)aM1J_Rwq ze72-lYyb1O9SmI5+9dNPc!3=3c*9zic)Wm&OwGUw3?KlraS8_fl*Ia-!{-vI8H5of zM$x1N8CX(9jmwuWCoPu!m1-=N4()n>Cprr;NRvYP^sJnm4gkLqa0t*3utaF7{$Ytu zOmM04mhGAp#vpla2^qwIafawOf)Wx2P_xD+l$DkJU2LKkGY;HO4&*6I04qT>j~T1{ zWr%tosCFJz&e`$=U2OlEz1Y`63V@Tf0;Gzo@^th4yq)9fwnXBI$-!9)%RDa5zG3?JEQnMehUmySyVV)6|>Fy6; zMs2A&)lQaw7MSd+tztzzRF->!D@gL(`DKrB*p?XqX~Mz1wmxU3a8qDGOoG~pEbja7 z6otbU?x@tDr!N3+{mUtkT-B8tQsk8OmnjAe+jF8&*&+Y1xL3qR<_rTdk^?@tyLH>q zExR|50~2QUUmA~|U=Lv33PR2Qb=dcJbUngP|K3?N23I=w&$el6FqP*k^55Aeq_p?W z=1o_-3`dWCTwX}p;+W&SVY%jq+p4|)dfT~WGzI9th}W+(fRF>iq6#>H>Sx<7sv!!_ zQ5UDY^mGL7D7sVshwmpEj<0GUNu7r(=hazLgo5?`M9r}ik*Us8q}`$$PDVG3GYj(b zFOz=BOdBUiN#nocUS{xY-M+B z9Tdp}D+TP4{CQ(`hMk%Z(#bvgQ|+pM87{J+|6Ly3I{TG%2q`TG*~DM5J-~b&oY~np zKD~w*4AX%V-islB8O*=NE(uSaZ(kkghds#Zh-KiLfz?aR%83-U{~ZGVlbv2lur(+= zafXQ;1Mlti7K#$TsoS@c19w9qM*qtM3t>9`_i*`jT|J%BI9fRtadHW*(AK!m_QT-$-8zMzX8m)1qhGy^KU+I zog2sjt{fqCk;?V&dJraPl#$6+L?^QPb2ba%I@BR&7X!)Z`-zrgC-kTm^8~+gfY6ZW z2cTlC<^KKqSpZosvFj&<`@u+2PG7(t9WCvzI}1%WnzXdTWyng7U6;@7)auXbU{=(S zi%iy$cJF<0?^e@TUVhWynVxI!idUqnR`F|;!OdJ4M+KI%GbZ-ct8^M#I^h+T-&R~T zcCP7-MAC?;n^Ks#)P%D0p|-kpdU6b_zh!m9W+SFOut1_QL~fv~s#HV}Gi_WG>{2rq z#J~5v)_U9DuXFs&oBG-QpIw1)a>AaK&Dh%NqUq)0LzOx1_1SYP{(F{OvzS=Qp0xUt~b!ts^c@@JR!S)nq)Y6wCpN-y3Sy873b6~>7$Q)S1w{M&oicBRa2X|PS-GOK?ANP++k;yZr)J}F-$1%Fc7 z4RNtf@AqAOCypP7xt6wM_tDYO+6CEMsCs-cYmeMRs-BC92+m``t|*DbN2Cd96w2bz zujNKy`|V1tVWiR6B(8@Syr%Z-rUSMD#6Xbk=~t*+;FBI|9y%gUBh3D<)iM`%3i}O|!B|+(C3AgBZcQ*(SRy)`8 zR0v6c)P8SO5CZ`S4Uy$^-`ai!K38JLK9*zz*Y7ru>i{q=GA=GJ#=aUUT+T^I)?`s; zf&v5KqZ2&(y%w>^1Obe1rUCs2IwC$RX~``ekq$}z1rHye5Hj)&esvh0K^S;vomn7d#TT zZLGcPd7ovNq(w$(;ZZcMUvHFaE(L}6k4xJhAngS(V4wjKk~mnCfNuuLP;@$_4n8H| zQ7%Rhq$HZD*I$ke7^*|T0WyJ@BicjR2Bj)68I6oPgUumhu~qYRte3pI1WnF6PriWI z1ib^6?&RbW^xe>^gEmGC=XL)tZA|(G=?IXu2%`WT8>b>10?<~8kdMtA?>ukyj+IaV~UV{=XXz4+vFwE>r9*-V(I9~)qCF=y;nsaB*Z6e$Rgabr?<;s1@ z9QZ~=kB z3M|ni1RAq|5na$_AabOr(|U<8;}sMu12e8ek9JcdL#%LWkdxhBvjsM*FYenD{nwtG zVZGs_E`UUh01D+^Yu<7Nv0MqE#$k~4riSwakXUXNiESC0X-gpK$pG*MT0brYye|;U zt@*cVg+YfXMIH-BU>`(^0Od9h=>CD=7n8VBlS!Ge22})%P4j^{fT|iXe^7Z?x!wnD zQN+9=MD^|Q}glhHM|&Oh8PnJO#myH zpQuEU-vv<2odtpT34VSo@+k*E9Nk`BMQ5M2k}PHKs77B819X5pB$nb*y8VmZOe{CqlLy2_YoQG`3MP zDhy*A`-Czv7-Q^)d2e0kdf(^0p3Zrm>;2=s-sk;e#`w*5e#`y++@IwRIcu!9K~Pi> zL68mlr%#?o5CJ~CcKoykj>L_~?twoj&r?>Ormps$K36<$AVya_-EO*i-o#$r?R~=o zhjn#Pk=Kw{lHHB*^mM}=QBZLH&js?X9u5jkFE?w#N!GcYzJNmz;Va88ffwiuEQ0L7 z=$|}p=9@U$L%7*8)mOu@y!1v!_oACkUfR*o%01Gj^P?{vziRDr_)!a|=IYve-Vf2~ z-nyilI;$^kOshMD-CM2O(kD^!OgHRNx{&LpRPR08;=ir>d7HCC*ZHl+7U6?yPCfw^!W^*fMM3c)|HVIe5lvW@}+v#2G4G41U%ibjfvAQ?A60zIS zFO1x}@f#XJV)p#$L5e$%5wzeO9TVe73EN?yuTRU)tC%l$njY)PhEEq=h?in7<1@WS z+La#UtUzw%f7V#i($b1Y6DmYSMRisA-)N~9OFT1k$xHYmB9T?GFxKo$>`7Pe^{wLA z3m}ywLsTq!Bq}oUnN6uTw&V4UD(Z!De33W1H%A!FQ`DYLVDNOMj1$iq8rEVI;1P7O z=btGwc6LgW8ECtg&!3;1>G5H_a>D!jw{~^y;FHYPGb*etLZ9Zd*%hE4J$1hLB!S z1lg=>X&Dt@;QtCMyo1A02f8qN`ZlYChw|$wLD}Uqq^{@ddf}GC9s7mM2 zvolRI!aD*FXfB~pD8c(xD=F{#UMVXp-wS9{(1%*N5d9l{b#>Qp)*@C|S;9!tc*ETG z?b~HUeijnxDsYH+5E{BU5KyDIs)oa76ZqNF)80@v!+D0@TxVBTYe&bSA%a3jY;0@| zli|lq8vgdJadC!`cjCSfwyW3~&#B&CivFBD=RMZ+;-(P-PDp`nSnfKH+-;{uaTr?Xzy$~QkgWcpgnyT%4k(b}B*z)WZkJIHvLH z6#}hoZI1k<#btCG7#MhtwCC?(lE>ezzgS@Z(9y}sYy9(ZEpDAkCkdA!?)&*Rt`}Ir zjq1)L-t2hR6iU; z!jz8S2E)e6xYUA*5nD^kj14;vYjgniMN)nxcM;gV<(-AtsAA`?^u>i4RfEKrwEUb!ZtGLo62i9r;y#uRJ_F?pYTEE#h;mN#}_@ z-U*V}-ZH=8p&{BXpYD_*C%Uwn*Z7RY_r~b@*an#W356eIdyvemtX|kDib#Z3Ulm+) zS6W_P+@l^^Yt3qHIXR=q>tXICwout{F)eQF^JBYzfABzX>(;HbPPlL( zE?feg8y_zktg~n9mMt&R()KSMsH9S<0u7V&oJ$#xA8*OIL^Mt&ERlkE0}|PA$_UMg z5A9kYEQ(hT*{>*@7JsN49T%5*TJl*~SQw{Q2to9tep@q9y7=$W8b55|ANNbLhP#fr zx%sF1`sl9Fwvmp4*6wc2tPLxXTR4@ELwAyn`bhus(~JE4bK1!!Q&UsYhYr#Ds_sW8 zC23)TY;BW+=4x%Fj~>0GK<2%kn3$OCa7e}i(5~eJlYBn=K#8Jp;WO-0y&4_EYRidy zZY6sF$kl(0r03N3a)&AzPE1(hCVPEr++*}q)6Xm+OgHsYU7eZargOTwlow-gA0Y=f zZt$FZO@OO)c6NT5Ss<6+Z84i$3@R!v79tH6(J!02yXR+RWqslJs``vsJ9if9L#I?- z&L9#kX&BE+(3-FfdK~uHm<54A))a5J}(lY*D9n^G`x2_Haa@3uuwI)s!w2`&&>+7`K{ZwNsIhUskxf}DsHz4zd~ChY#DaeB0CsvFlZ^!e@G5>{?$OLKGTr%wj@ z=l%RhS=reGTy_adK5*`9Y{^Wo{}i0SX=bcvnH`{pl(BPQE;izLDE{l$%Dd1()@o{M zg26h{2M>a98}f{9B_$;p7%fiw3&K8v_@BtO$Z0aSv`H%~)9mqQmtQQ$PyNwJ;b4XGp!v+D@%w1Z$H@Juy|N%h zJ|IOmYPa2Q6`f^ z8Od3IeC=(a)k{8o`ca;<<5%kA)tnlS5WD1vU8C2XK-hi--uEF{OUufdDT;(eR9{tE zefRj*?c0Up(GFCx!11?h9bH``7%nA42W$w7Q}7S-YXE{!Zl^jdExRDIbLUc?J=-g1 z{pKui6UfoI8#mG<~pnr8i+#n}#uqi;H`3a_^@PA4J%r2=X`8 z5X^29+W#{lc!dM^l)K+B1~Wf76t5jv!VBVGV1DNmG5#MSP+V-WFvF(v=D1)gpIxg7 z-+)^76&EW4NWFNL9MJJ6*3|I5oi2^cWI_-%VJ!eDP2^fw)N0TUx;5@$u}hD%{)6hP z6ZrBH=2QPd`}%mc4Fixq)STf2@*u6CAVE`0rM*yAQ30eqe)OpCdMSdO!GvIbhaLZ+ zeR{T_;Whl&I9WRx1zc=EJ&(@1o&YT-8#(X7uTN0V&dk&=^&UNs$Irjw{vGfo0rl48DelJFlF)oILs{4VaLWr$R zd-qOf_1(9#Rbb&mD!cErMMy|Mh3yzqX znLQ6)zdfs>;xc41AdJV7(Xp{I3JNA(US5&U(ThVSS(%x%^$KM`RJ>XLmGWidIySz2 z!PjQbf)_jeSFXr7Ej?)A&bufR?aYb_?ZtUIS=R8)kA?rU(KfuAeYBy%N%1E>;+ zUA8+P_#AmM`%lv5zn)9~*H+q_aa=K&Wn~-Ygh= zFHr*C%8j8T4&Q87#B{T!j&#T)2=gIl5Wat` z7cKOT4%Fwg5QuL>!P_r4mUyuyD_07Cb3iY|!8VxJ18u&idzSWO<>c&|&=U|jnuzOn zrz}6sa&=^=^FEuNXVOz_d49A#ziKYHUig@)X_Pz3dJqDE8lT5R*TYX;(v1@A z-}Q|{R1Tc6iHeD_UnV{-O-~}ui`5qQF-j^ySbKK&$D_#_iBCBXw#uA2apEq@?ei^^ z@A&U?qpk!e;Octv(o~)#JK(B2p32a`PrmqATdQIiBdbK7Z_SG==vY@bgqoS2jt5_W z8+fQ54^F2>Obg!v_en1#5~ci@n?sv%K}&N?aNCC)(EKtKoWu{7o^f%>y-?(69_gd) zuBxt{0I@dS^0Hs`X=PA?BPD=!+n*fUZKpl|Z6EjjW|JpiahjW&`oEQ+f16dX ze$xo`tmgMH7_LyFE6@)25((UT^@KFTSRoPaT)?0YdBH|!2K5M~HNajD>~TlDvi!zK z%uPkr+;zM zQ&CJ9HW*b`S3_2Su^X+Mge$@}ADEh%k#g$VOvOOC3t0F*&$)iHL$GQ}LGuExqL`&Tj(Lkye3*xj|JDSH@C1z2dHG_=ew5? zy)So^`s5vU?tJdtRg8rZ6aH(oWugC!3&=ZseUB|NV`_WNR zDqrFg6UFqn&g$_hOO$I7TIpaxSoP|R7D!gnAE5BY4Re43T1IkER#Q{cvU!M-G>TW% zzb`D&_VPl(rqZEx7**Q_5{VSA>Gv9z^k0MFDM=^gZvdJv9;8hr%n*z!v+OTMIN?K# zRAQ^!Vl5b5PC?Mn+VMKZSC7nBug<=;Q(X4(TYg?+4m|rMzQ4a;fV&^t@KmdcO6WR>sryL%-cXxQnFvfO<#Wh9ww}pby^v6qS9I+F~#J-={P0I6E&x{ zC($yN6efXtj*MR7L<~YyPftm?(jU~)Aad=gZ~rXyIHEt@bX@ShozWc&8Jdr)GnJwhI-ezREa_J<~l#^e}2x*zQU@Bz!B zqMh9ErpHAEH+Y8oVPC`(6$h%MAANH~6iz#EzR(X0Up-*y41^{QzI<@3lzo^#*FcCQ zbJq0(0fH^259rx)%~uYLZbH~X1I&<* gdHhe(ejQ)n<3mc$(*;{Euq}xGDdUs5I(B#d1JQK)!vFvP diff --git a/docs/_images/25df2062ad3700c81a8b794b1ef223cde14a6261e0a0c6847c5eae4e66b36974.png b/docs/_images/25df2062ad3700c81a8b794b1ef223cde14a6261e0a0c6847c5eae4e66b36974.png deleted file mode 100644 index f640f6f909e2c1b2494d1156ec8b2ca559dcea5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13134 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 diff --git a/docs/_images/5f97d746cc7ecc6f6b019798aa120dad266f23e1b0186bd2a5732708623cdeb0.png b/docs/_images/5f97d746cc7ecc6f6b019798aa120dad266f23e1b0186bd2a5732708623cdeb0.png deleted file mode 100644 index 56d4d92143f930864dd31c970cb777c2374c7bcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54195 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Ð{QJs~Xbq3vj`vZM9I-bWe&B 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 D#PGDp diff --git a/docs/_images/7556072b7a36943860bd4c1c5829ff74f010fee9a46b2d2bcb8b87f6923cf739.png b/docs/_images/7556072b7a36943860bd4c1c5829ff74f010fee9a46b2d2bcb8b87f6923cf739.png deleted file mode 100644 index 9e89eec22255091b2668cb826f0b068ddcafbade..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12634 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⪚D^7KPb9?M-y=5n&_ZZr_1y=R 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¹kVvFGT5d%@C1M%`Pr%uAJpK4 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 - - - diff --git a/docs/_images/Series.svg b/docs/_images/Series.svg deleted file mode 100644 index 9891ee70..00000000 --- a/docs/_images/Series.svg +++ /dev/null @@ -1,198 +0,0 @@ - - - - diff --git a/docs/_images/a16d85caab45576176dc3f2bc6eef311402d904954b77d7bd73b1af5c2c007f7.png b/docs/_images/a16d85caab45576176dc3f2bc6eef311402d904954b77d7bd73b1af5c2c007f7.png deleted file mode 100644 index 1f37388d54d8134e79b062ebe5870facda82edb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16592 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 diff --git a/docs/_images/alipay.png b/docs/_images/alipay.png deleted file mode 100644 index 9f98e7a435dec0777b9f82e711388f3ee8efa51a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115383 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%0A~X1tX!V0vUwW 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 diff --git a/docs/_images/anatomy.webp b/docs/_images/anatomy.webp deleted file mode 100644 index cb6521ea0a57bf807eee321f001e3d8c479e3a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65490 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 - - - diff --git a/docs/_images/ddc64ab226fd1a3956c71f9c6cbf4a326671637ed63df97a498fb09adead8ff5.png b/docs/_images/ddc64ab226fd1a3956c71f9c6cbf4a326671637ed63df97a498fb09adead8ff5.png deleted file mode 100644 index 799460b147731649d878e3afb260db6acc6f1ad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16556 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 diff --git a/docs/_images/e13468724a69b18b97067266b4b8472005c483a31388fbfd0d7ea798ff675ddf.png b/docs/_images/e13468724a69b18b97067266b4b8472005c483a31388fbfd0d7ea798ff675ddf.png deleted file mode 100644 index 98367bcaac5736cb9b1b3ddfefb6a997694ac830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16328 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 Wb!RDN-e9v7X{nP(;}4&`_P+pE-VP@K diff --git a/docs/_images/e6bee8d9621c3b7a478c3ec6bc08bee3f567d2c03f382b7478eda8a2c93029d6.png b/docs/_images/e6bee8d9621c3b7a478c3ec6bc08bee3f567d2c03f382b7478eda8a2c93029d6.png deleted file mode 100644 index 91c17ffa24fe128c0d001af666079e7e4d1e0328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20447 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�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 diff --git a/docs/_images/fa955cffcfe65fef1120e5b0e3b567e3adf8376e93b8e089551e47b1b85f1064.png b/docs/_images/fa955cffcfe65fef1120e5b0e3b567e3adf8376e93b8e089551e47b1b85f1064.png deleted file mode 100644 index 2f24740d126ca3d891a15f272dd2f8cfc9f844a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8253 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 - - - diff --git a/docs/_images/groupby.svg b/docs/_images/groupby.svg deleted file mode 100644 index 1170c05e..00000000 --- a/docs/_images/groupby.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
省份
省份
身高
身高
体重
体重
北京
北京
168
168
98
98
天津
天津
178
178
150
150
河北
河北
175
175
130
130
天津
天津
181
181
160
160
北京
北京
165
165
110
110
北京
北京
168
168
98
98
北京
北京
165
165
110
110
天津
天津
178
178
150
150
天津
天津
181
181
160
160
河北
河北
175
175
150
150
分组阶段
分组阶段
汇总阶段
汇总阶段
省份
省份
平均身高
平均身高
北京
北京
166.5
166.5
天津
天津
179.5
179.5
河北
河北
175
175
分组变量
分组变量
汇总变量
汇总变量
mean
汇总统计量
mean...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/_images/melt.svg b/docs/_images/melt.svg deleted file mode 100644 index c980ef44..00000000 --- a/docs/_images/melt.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -

id

Student_id

Name

Math

English

History

0

1

Amy

90

85

88

1

2

Bob

78

92

76

2

3

John

88

79

90

idStudent_idNameMathEnglishHistory01Amy90858812Bob78927623John887990

id

Student_id

Name

Subject

Score

0

1

Amy

Math

90

1

2

Bob

Math

78

2

3

John

Math

88

3

1

Amy

English

85

4

2

Bob

English

92

5

3

John

English

79

6

1

Amy

History

88

7

2

Bob

History

76

8

3

John

History

90

idStudent_idNameSubjectScore01AmyMath9012BobMath7823JohnMath8831AmyEnglish8542BobEnglish9253JohnEnglish7961AmyHistor...
id_vars
id_vars
value_vars
value_vars
var_name
var_name
value_name
value_name
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/_images/merge-how.svg b/docs/_images/merge-how.svg deleted file mode 100644 index c5df3991..00000000 --- a/docs/_images/merge-how.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
how="inner"
how="inner"
how="outer"
how="outer"
how="left"
how="left"
how="right"
how="right"
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/_images/merge.svg b/docs/_images/merge.svg deleted file mode 100644 index 802fafe2..00000000 --- a/docs/_images/merge.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
id
id
customer_id
customer_id
state
state
0
0
2
2
California
California
1
1
4
4
California
California
2
2
6
6
Texas
Texas
3
3
7
7
New York
New York
4
4
8
8
Indiana
Indiana
id
id
customer_id
customer_id
product
product
0
0
1
1
Oven
Oven
1
1
2
2
Oven
Oven
2
2
3
3
Oven
Oven
3
3
4
4
Television
Television
4
4
5
5
Television
Television
5
5
6
6
Television
Television
id
id
customer_id
customer_id
product
product
state
state
0
0
2
2
Oven
Oven
California
California
1
1
4
4
Television
Television
California
California
2
2
6
6
Television
Television
Texas
Texas
custom_prod_df
custom_prod_df
customer_state_df
customer_state_df
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/_images/pivot.svg b/docs/_images/pivot.svg deleted file mode 100644 index 87f82528..00000000 --- a/docs/_images/pivot.svg +++ /dev/null @@ -1,444 +0,0 @@ - - - - diff --git a/docs/_images/s1.svg b/docs/_images/s1.svg deleted file mode 100644 index 742af069..00000000 --- a/docs/_images/s1.svg +++ /dev/null @@ -1,202 +0,0 @@ - - - - diff --git a/docs/_images/s2.svg b/docs/_images/s2.svg deleted file mode 100644 index beb611cf..00000000 --- a/docs/_images/s2.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - diff --git a/docs/_images/slicing.svg b/docs/_images/slicing.svg deleted file mode 100644 index f2b437c4..00000000 --- a/docs/_images/slicing.svg +++ /dev/null @@ -1,220 +0,0 @@ - - - - diff --git a/docs/_images/wechat.png b/docs/_images/wechat.png deleted file mode 100644 index a0bda1bffe3391918497943b0563ff6480136e50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117071 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álo6lm=KV71 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" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "

" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "x = np.linspace(0, 2, 100) # 创建一个包含100个点的线性空间,范围从0到2,用作示例数据\n", - "plt.figure(figsize=(5, 2.7), layout='constrained') #直接用plt.figure创建图\n", - "plt.plot(x, x, label='linear') #在坐标轴上绘制数据,绘制一条线性函数曲线,标签为'linear'\n", - "plt.plot(x, x**2, label='quadratic') # 在同一个坐标轴上绘制二次函数曲线,标签为'quadratic'。\n", - "plt.plot(x, x**3, label='cubic') #在同一个坐标轴上绘制三次函数曲线,标签为'cubic'。\n", - "plt.xlabel('x label') # 为 x 轴添加标签,将x轴标签设置为'x label'\n", - "plt.ylabel('y label') # 为 y 轴添加标签,将y轴标签设置为'y label'\n", - "plt.title(\"Simple Plot\") # 为坐标轴添加标题,将标题设置为'Simple Plot'\n", - "plt.legend() # 添加图例,以便显示每条曲线的标签" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. OO-style 面向对象编程" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "x = np.linspace(0, 2, 100) # 创建一个包含100个点的线性空间,范围从0到2,用作示例数据\n", - "fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')#创建一个大小为5x2.7英寸的图形(Figure),并使用constrained_layout参数启用了约束布局。然后,创建了一个坐标轴对象ax,可以用来绘制数据。\n", - "ax.plot(x, x, label='linear') #在坐标轴上绘制数据,绘制一条线性函数曲线,标签为'linear'\n", - "ax.plot(x, x**2, label='quadratic') # 在同一个坐标轴上绘制二次函数曲线,标签为'quadratic'。\n", - "ax.plot(x, x**3, label='cubic') #在同一个坐标轴上绘制三次函数曲线,标签为'cubic'。\n", - "ax.set_xlabel('x label') # 为 x 轴添加标签,将 x 轴标签设置为'x label'\n", - "ax.set_ylabel('y label') # 为 y 轴添加标签,将 y 轴标签设置为'y label'\n", - "ax.set_title(\"Simple Plot\") # 为坐标轴添加标题,将标题设置为'Simple Plot'\n", - "ax.legend() # 添加图例,以便显示每条曲线的标签\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_sources/ch-matplotlib/matplotlib-data.ipynb b/docs/_sources/ch-matplotlib/matplotlib-data.ipynb deleted file mode 100644 index d4d71982..00000000 --- a/docs/_sources/ch-matplotlib/matplotlib-data.ipynb +++ /dev/null @@ -1,123 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Matplotlib 输入数据" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 可接收的数据\n", - "\n", - "Matplotlib 通常会和 pandas 和 NumPy 一起使用,Matplotlib 可绘制的数据大致有:\n", - "\n", - "1. NumPy 数组(`numpy.array`)或 `numpy.ma.masked_array`。\n", - "\n", - "2. 可以转换为 NumPy 数组的对象。如 pandas 数据和 `numpy.matrix`。也可以使用 `numpy.asarray()` 方法将其他类型的数据转化为 NumPy 数据。\n", - "\n", - "3. Key-Value 数据结构:比如字典(dict),结构化的有 Key-Value 结构的 Numpy 数组(Structured NumPy Array)或 pandas DataFrame。Matplotlib 允许通过 data 参数传递这些对象,并传递与 x 和 y 变量对应的字符串。\n", - "\n", - "## 案例:Key-Value 数据\n", - "\n", - "输入为 Key-Value 的数据,Value 为用 NumPy 库随机生成 50 个点,并用 `scatter()` 方法作出散点图." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'entry b')" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf8AAAEZCAYAAACZ7CwhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAABjeElEQVR4nO3dd3hUZdrA4d85M5lJn5BOqKH33iLYKCJ2ZZV1UVHR3VVwVdT9ZNe17Kq47lpXQXdVsKPYsdNFepfeBEJJgUB6MpOZ835/xEQCKTOTmUwmee7rmkvnlHeeHCZ5znmrppRSCCGEEKLZ0AMdgBBCCCEaliR/IYQQopmR5C+EEEI0M5L8hRBCiGZGkr8QQgjRzEjyF0IIIZoZSf5CCCFEM2MOdACNjWEYHDt2jKioKDRNC3Q4QgghhNuUUhQUFJCSkoKu1/x8L8n/DMeOHaNNmzaBDkMIIYTw2uHDh2ndunWN+yX5nyEqKgoov3DR0dEBjkYIIYRwX35+Pm3atKnMZTWR5H+Giqr+6OhoSf5CCCGCUl3N1tLhTwghhGhmJPkLIYQQzYwkfyGEENWyu0o5bs+i2FkU6FCEj0mbvxBCiCqKnEV8evQDVucsx6mcaGj0jRnIb1pfT7w1MdDhNXpKGRwtXs+uvC/IcxxGQyPW2onuMVeSGNqrUQwjl+QvhBCiksOw8+yeJ8goOYqBAYBC8VPuRvYV7uav3R+nhSU2wFE2XnmOI3x/9P/IK0tHw4TCBcApx0H2FXxHYmhPRqc8Sbg5sNdQqv2FEEJUWnliOUdLDlcm/goGBsXOIr7L/DJAkTV+BWWZzD/8R/LLjgJUJv7T//946S6+PHwnpa78gMRYQZK/EEKISmtPrqxxn4HBmpMrGjCa4LIy+znsrsIqSf9MChcFZRlszHm9ASM7myR/IYQQlUpctXfus7tKGyiS4FJQlsnholW1Jv4KCoM9eV9TZhQ3QGTVkzZ/IUSTcyK/iB93H+RUUQkOlwtbWCidkuMYmNqqUXS2aszahXcgqzTzrGp/AA2N1uFtAxBV43ewcCkaGgrl1vFOVcrhojV0iLrQz5FVT5K/EKJJUEqx8cBR3l+5hQVb9+IyFCZNA03DMAwU0C4+hokj+nP5gO5EhVkDHXKjdGHiGFaf/LHafQrFqMSLGzii4FDizEVDR1Vz01Q9jVJXrj9DqpVU+wshgl5BiZ3b//sxk2bNq0z8AC6lcP2S+AHST+Qy47MljHz8fyzfdSBwATdi7SI6MLHtLWho6OiV/wUYnTSOIbHnBDjCxilED3X7qb+cwqwF7gZUnvyFEEEtt6iEm2Z+yMHjpwAqE391KvaUOsqY8sbnzLj+Yi7t360Bomx4dpeD/YXHKHaVEm4KpUNkCqEmi1vnnpswkm7RvVhxYhnH7VnYQmIYFjeCtuHt/Rt0EGsZ1h+FZ534Wob3808wbpDkL4QIWg6nkymzP+fQiVMYyv2nLkV5M8Ff5n5LQlQEQzo1nWW8M0tO8vnR5XydsYpil71ye7jJyriWw7iy1QhahsXXWU6CNZGrWl3rz1CblKSwPthC2pJXdhjqqAHQ0GkVPpiokJSGCa4aQVPt/+ijj6JpWpVXt26/3rGXlpYyZcoU4uLiiIyMZPz48WRlZQUwYiGEv32ydjtbDmXU+rRfG6Xgb/O+x/Dy/MZm48nd3LbuKT458kOVxA9Q7LLz6ZHl3Lbuadad3BWgCIOfUoqflu/kyRtf4oYu93BN0u8Z3/IP3NzzPo5/1q38S1Wr8oaUgfG3NUi8NQmqJ/+ePXuycOHCyvdm86/h33vvvXz11VfMmzcPm83G1KlTueaaa1ixQsakCtEUKaV4d8UmNOp6zqqZoRRHT+azZl86aV3a+TK8Brc7P52Htr6GU7lqbHs2MCgzFA9vfY1n+k2lh619wwYZxJRSfPPGEj564RuO7s3EZNZxOX/t3FeYW8z8h3NoszKewX8/gabroFXt/Keho2tmRqc8SUJoYJubgir5m81mkpOTz9qel5fH66+/znvvvcfIkSMBmD17Nt27d2f16tUMGzasoUMVQvjZxgNHOZB9qt7lmHSN91duCfrk/5+9H+OqJfFXUCgMZfDi3o94ZdD9DRRdcHPYy3jm9/9j6YerqBgpenrir2A4DQ59GUnuLisdrsun0/gSMDsBsOiRdLNdQfeYq4gKadmQ4VcraKr9Afbu3UtKSgodOnRg4sSJpKenA7BhwwbKysoYPXp05bHdunWjbdu2rFq1qtYy7XY7+fn5VV5CiMbv8w07Men1H7PvMhRLduwnrzh4J6/ZV3CE3QXpGG7WgRgo9hceZXd+up8jC34ul8GMm15m2UerATdq9YG8fSFsejKOj9NSsH51G9enfsINHeczJOGORpH4IYiS/9ChQ5kzZw7ffvsts2bN4sCBA5x77rkUFBSQmZmJxWIhJiamyjlJSUlkZmbWWu6MGTOw2WyVrzZtmk7HHyGasmMn87xu6z+TUnA8v9AnZQXCoqwNmDTP/pybNJ2FWev9FFHT8e6Tn7Jy/gaUF981w6Hzzl8Wsumrg+ha46pob1zR1GLcuHGV/9+nTx+GDh1Ku3bt+PDDDwkLC/O63OnTpzNt2rTK9/n5+XIDIEQQKCx1+LS8InuZT8trSCcceSgPRjtAeX+HHIfUdNampLCUj57/2vtOJYCmabzz5KcMv3JQo5pdMmie/M8UExNDly5d2LdvH8nJyTgcDnJzc6sck5WVVW0fgdNZrVaio6OrvIQQjV9kqHtj1t0VYQ3xaXkNydOnfgDNy/Oak8VzV2Ivrt9NplKKA1sPs3v9zz6KyjeC9l++sLCQ/fv307JlSwYOHEhISAiLFi2q3L97927S09NJS0sLYJRCCH9JbhHtkzZ/AE2D+KgIn5QVCK3CEhr0vOZAKcVnL3/vk6d1k1ln/n8X1n1gAwqa5H///fezbNkyDh48yMqVK7n66qsxmUxcf/312Gw2Jk+ezLRp01iyZAkbNmzglltuIS0tTXr6C9FEXTGwu0/a/E26xnndUomJ8L75MNDGJg/xuGbaQHFx8lC/xNMU5Bw7Rfquox43p1TH5TRY/eVGH0TlO0HT5n/kyBGuv/56cnJySEhIYMSIEaxevZqEhPI71+eeew5d1xk/fjx2u52xY8cyc+bMAEcthPCXwR1a0y4+hvQTufVpksVlKH43vJ+vwgqIxNAWpMX1ZHXOjmpX4zuTCZ2BsV1JDottgOiCU/5J33YALc4vQSl1Vk1CSVEpmqYRGt6w8/wHTfKfO3durftDQ0N5+eWXefnllxsoIiFEIGmaxsQR/Znx2ZJ6lAEtY6JI6xzcY/wB7uryG3ZteIa8siJcquYbABM6USHh3N1Fpu6tjavM5dPyDENhuAxMZhMAh3YfY9Zf57FlxR7QYOD53bnjieto1SHRp59bk6Cp9hdCiDNdM6QXPVoned32r6HxyPgx6D7qOxBI8VYbz/e/m+TQ8qd5nao/U8X7hNAYnu//JxJDWzR4jMEkIibcp+VZwy2Vif9kdh73X/ksW1fvK9+pYNPy3dx3xTMU5Bb79HNrIslfCBG0QkPMzJp8Fa1a2Dy6AdB+ef392jEM7xr8T/0VWobF8b/B/8dDPW6ie3T7Kvu6RbfjL91v5I0h02kVLh396hLfKpbwqFCflKXpGu17/jqE/Nt3VlJcUIrh+rWGxnAZ5J8sYuEHq33ymXUJmmp/IYSoTmxkOO//6Xrumv05Gw8ew6RrtXYE1DSwmMz8a+IljOzVsQEjbRghupnzE/tzfmJ/nIaLEpedMJMVs24KdGhBxWIN4eJbLuSzl7+rkqS9oQzFlXeMqXx/cNfRavupaLrGgZ1H6/VZ7pLkL4QIerbwUObccR1r9qXz/sotLNmxHxToenllt6EUhlKktIjid8P7c9WgHkHdu99dZt1ElO7b6uvm5LLbR/LJi9/Uu5zImHDOvXpw5fuktvFomnb2OgxKkdy27uWWfUGSvxCiSdB1jbQu7Ujr0o6M3AKW7zzAqeISypwuosNC6ZQcx7BObZtE+75oGK06JTNwdG82L91e7UI+7tB1jUtvH4XltEmpxk08h8/+uxiltMppgzVdI8Rq5qLrG2ZuGk35YhBjE5Kfn4/NZiMvL09m+xNCCC8ZhuJEYREFpXZCQ0KIjwzHGhJ8z5snjp5k6vCHyTtR4HH1v27S6TwglX999xesYVVnpNy4bCfPT3uX48fKV6ZMahvH/S/cRK9hneoVr7s5TJL/GST5C9G0FTsLWX9qGatzFnHKcRyXcmE1hdIlsg/D48eSGtGtUc3BHmxOFhbzyYbtvLd6M5l5v46VDw0xc2X/Hvx2aB+6tgyuDocHdxzhwXFPkZ9TgMvNGwDdpJHaqy0zvvw/bPFR1R7jchkc3HkUXddp160lul7/PviS/L0kyV+IpslQBt9kzOWHE19hVLPuvY6OgUGStTXXt51C6/AOAYq0nFKKwrwSiovsREaHEeGjnuf+opTi7ZWb+Pc3y3Epo9qlbys6Y47q0ZF/XjeOcEvwrKdw/MhJnrzpJXas2ovJrNfYDKCbdJShOP/aodw7czKhEQ377ybJ30uS/IVoelzKxVsHn2N7/ro6j9XQMWkmbuvwIJ0iezVAdFXZS8tYOn8zX7yzkp93ZVRu7zWoPZdPPIfhF/WsHC/emLzw/QpeXbrWrWN1TaNHSiJzbr82qG4AAPZvOcSX/1vEwnd/xFFadSXIqNgILrt9FJfceiGJDdRx70yS/L0kyV+IpueTI6+zMmcB7q7NqqERolu4p/MMEkNb+Te405w8XsBDk1/nwO5MNF2rsoa8rmsYhqLvsI48/PJNhEc27HSwtfl84w6mf/SdR+fomsbIHh15ceLlforKv4rySzi8+xiFuUXoJp2omAja92pDiCWw/RrczWEyyY8Qokk7Yc9kZc73eLIou0LhNMpYmPWJ/wI7Q2mJg7/e8hqH9mWXx3DGXAXGL++3rv2ZJ/70DoZRv7HnvmIYiv8sXOn5eUqxcPs+9mae8ENU/hcRHUa3wR0ZNKYPA0b2ovOA1IAnfk9I8hdCNGmrcxaie/GnzsBgc+4qCp35fojqbAs/3cjBvVl19ig3DMXGFXvZsHxvg8RVlxX7DnEst8Crc026xvtrtvg4oqqchssnK/M1NcFzmyKEEB5yKSercxa5tdJddRQG604u5cLEK3wc2RmfoxSfv7UCTaPajnJn0k06899dyeDzu/o1Lnd8tG5rnbMq1sRlKD7buIMHLz0fi9k36Ugpxbbcw3yYvpolWTspcTnQ0UgOi2F8myFc2XogLawRPvmsYCbJXwjRZBU68yk1vF8oRUMjq/SIDyOq3onMPI4cOO728YbLYMPyPRiG4ZPhYfVx4PgprxJ/hdIyJzmFJbSMqX44nCeOl+Zz/8Z32ZZ3BJOmV65uaKA4VnKKl/Z8z8y9C7i904Xc1vHCZj2kU6r9hRBNlt1VWq/zFQqHUb8y3FFcaPf4HMNQ2EvK6j7Qz0rL6h+D3emsdxnZpXnctHIWO/OPAVS7rLFC4VIGr+xdxL92fNmsmwMk+QshmqxQU/3m79fQCDX5f258b1aP000a1rDAD5OLCqv/OPZIq6Xug2qhlOKeDW+T4yisNulX54P01Xx+ZEO9PjeYSfIXQjRZkWYbUeYYr883MGgd5v/JfuKTomnXOQl3a6FNJp0h53cLeJU/wODUVh4tp3ymlJgoYiPqd4O1Nmc/u/Mz3E78UL6k8+v7l2J4cE5TEvhvjhBC+Imu6QyPvwgN75JTiGZhQItzfRzV2TRN44obz3Grsx+UTwt72cSGWQCmLhOG9PG6zV/TYGJa/3ovtvTBodWYNM/SmQKOlZxibc7P9frsYCXJXwjRpA2JHQVeJH8dncGxF9S76cBdo64cQMceKeim2v8s67rGkAu60f+c+i0A4yupCbEM7dAGkxed58y6ztUDe9R6jNMwam2bLzOcLM/e5dFTfwWTprMoc5vH5zUFkvyFEE1adEgMFydf59E5Ojrh5ihGJV3tp6jOZg0N4YnXJ9Oxe8vyGM54Gq64KRh4bhemP/+7RlHlX2H6ZRcQYjahe3gD8OdLzicmvPqbq8/37eSiD2fT6X/P0uONF3ho+QJOlpw9cqOgrBTDgwmcTudSBqccRV6dG+waz7dHCCH8ZGTiVZwXf6lbx+rohJki+UOHh7CFxPo5sqpssRE88/4d/Pnfv6VLnza/7tCg37COPDLrJh59ZRKhYfXrIOdrXZLjeWXSVVjMJrdrAO4cOYyJaf2q3ff6Txu4e9FX7D2VA0CJ08n7O39i/OfvU+CoOjLC0+r+02lo9To/mAXtT/3UU0+haRr33HNP5bbS0lKmTJlCXFwckZGRjB8/nqysrMAFKYRoFDRN44pWN/Gb1r8n2lye0M+c9U9DR0OjW/QA7ukyg5ZhbQMRKiEWMxde3o/nPriTTzf9nfdW/JXPt/yDJ96YzLCRPRrVE//phnRow9w7rmdQamuAszoBVrxvHWvjn9ddzNTR1fdZKHQ4+Nfa5UDVCZldSnEw7xQf7Npa5fjIkFDCTN7dDOmaRsuwGK/ODXZBOcnPunXrePXVV+nTp0+V7ffeey9fffUV8+bNw2azMXXqVK655hpWrFgRoEiFEI3JsLhRDIm9kF0Fm1iTs5gTjkycRhnhpki6RPUhLW40MZbArMZWndBwC6Hh/nnKz3fY+WjvVnadOk5qdCzXde5NXFj9et13SY5n9m2/4eCJU3yw9ifWHzhKQUkpYZYQUhNi+c3gXqR1bFvr5Dqrjx2m1FX9uH8FfPvzHm7rM6hym0nTuaL1AD5KX+txu79LGVzeaoBH5zQVQZf8CwsLmThxIv/73/94/PHHK7fn5eXx+uuv89577zFy5EgAZs+eTffu3Vm9ejXDhg0LVMhCiEZE13R6RA+kR/TAQIcSMFnFBVw5/x0yiwowaTqGUryydQ2fXDaRjra4epffPr4F/3fJ+V6dW1f7vauazn+/aTOUDw6t9uhzdDT6tGhLx6gkj85rKhpn/VEtpkyZwqWXXsro0aOrbN+wYQNlZWVVtnfr1o22bduyatWqGsuz2+3k5+dXeQkhRFP2/KaVZBcXogCnMjBQFDjsPLl2aaBDY2jL1lh0U7X7dDRGt+t41vYOUYlc1qq/R0M6NU1japeLvI4z2AVV8p87dy4bN25kxowZZ+3LzMzEYrEQExNTZXtSUhKZmZk1ljljxgxsNlvlq02bNjUeK4QQTcHiw/vPeoJ2KcUPRw8GJqDT2Kyh3Nl/6FnbTZpGYkQEv+vRt9rzHup1FWnxnepM/9ovvTv+0eda+se2r3/AQSpokv/hw4e5++67effddwkNrf90khWmT59OXl5e5evw4cM+K1sIIRqjKIu12iQZGdI4RhHcPTCNx4aPJCk8EihP/BenduGTq35Hi9DqhwaG6GaeG3gjt3a8gAiTFag6u0NFr/5OUUm8POQWxqb0qaaU5iNo2vw3bNhAdnY2Awb82jnD5XLxww8/8NJLL/Hdd9/hcDjIzc2t8vSflZVFcnJyjeVarVasVqs/QxdCiEZlYrd+PLp6UZVtGhrXd63+qbqhaZrGpF4DuLFnf3JKiokICSHcjRsTs27izi5juKXj+SzI2MrSrJ2cchRi0c20iYjjqtaD6Glr3axX86sQNMl/1KhRbN1adYjHLbfcQrdu3fi///s/2rRpQ0hICIsWLWL8+PEA7N69m/T0dNLSGsc0mEII0RhM6j6A9Pxc5uzciKEUGnB1xx7c3f+cQIdWha5pJIRHeHxemMnCFa0HckXr+nXqLHLmc8qRia6ZSLC2JkRvOg+KQZP8o6Ki6NWrV5VtERERxMXFVW6fPHky06ZNIzY2lujoaO666y7S0tKkp78QQpxG1zQeGTaKO/sOY39uDu2iW9AyIirQYTUaWaUH+SF7HjvzV2JQPnzQqocxoMVYzk0YT7g5OsAR1l/QJH93PPfcc+i6zvjx47Hb7YwdO5aZM2cGOiwhhGiUEsIiSAjz/Mm6KTtQuJV3D/0dl3Ki+HXeALtRwuqcL9iVv4pbO/yTqJAWAYyy/jRV24oJzVB+fj42m428vDyio4P/7k6IpsowDHas2kPhqSJ6n9uNCJskMVE/Ja5Cntt9G2VGKaqG+QZ0dNpG9OTm1Mer3R9o7uawJvXkL4RoHk5mnuLBsY9zYGs6ANYwC//31l2cO16a+IT3tuQuwWGUQi0TDRkYHCzaSnZpOomhgZkC2heCZqifEEJUmHnPbA7tOFL53l7iYMYNL5J/siCAUTUsQ7nIKtlDetEmskv3obxY0lZUtS13ObUl/go6OtvzgnvaeHnyF0IEnZWfr8NwVU12ZfYyNi3axvnXNu3RPU7DwcaTH7P51BcUOXMqt0eFJNK/xVX0i70SkxYSwAiDV7HL3RleNUpcwX2jKU/+QoigExZZ/UQv4dHVb28qHEYJH6U/wMrjc6okfoCCsmx+yP4fn6Y/hNNwBCjC4BZhtoEbUwQrVND3+JfkL4QIOldOuZjT52nRTTpJ7RMYMKp34IJqAAszniOzZHeNndFAcaR4M0uzZjVoXIHiMJwcKMzieGmeT8rrbTsfd6r9FQa9bCN88pmBItX+QoigM/Gh8bicLj79z9eUFpYyYFRv/jTzdkzm6heEaQryy7LYnb+MupKTQrE991vOSZhEuDmmQWJraEop3j20lHcOLqXQWQJA35hU7ut2NR0ia57RtS59Yi5gcdY72I3iGm+wNHQ6RPYl3tra689pDGSo3xlkqJ8QwUMphWEYmExNN+lXWH38HVafeKfK2POaaGicl/QHBsRe0wCRNbw3fl7AGz8vqLJN13QiTFbeGjaNhFCb12WnF+/k7QOP4FJllRP8VNDQibOmcEvqDCIaabW/uzlMqv2FEEFL07RmkfgB8soycKc9GkDDRJ4jw78BBUiRs5R3Dy49a7uhDIqcpXx8ZGW9ym8b3p0/dHqWPjEXYtJ+rRwPM0VxbsJvuK3D04028XtCqv2FECII6Jonf64VutY0b4p25x/BbpRVu89AsT5nL3QaV6/PiLe25qrWf+LilreRV3YcXTMRa0mucjMQ7OTJXwghgkDLsG4oXG4da+AiOay7nyMKDIup5mGMGhBay35PhZrCSQptR4K1dZNK/CBP/kI0Oafyitiw9TC7D2SRc6oIDUhKiKZrhyQG9mpLZETTWZmsOekafQFLM2dRpkrrPDbMFE2nqMa1Qp+vdI9uQ4I1mhP2/LO65ClgZFLjWJa4sZPkL0QTcehoDq9/sJKlq/fgMhQmk476ZblWNA2Xy8ASYmbcBT245TdpJMTJKm7BJEQPY3jiLW4N4zs38Xa/TvSjlGJdzs/8eHw3+WUlhJlC6B3TltHJvbCY/JtWTJrO/d2uYfqWN9E1DdcvMxtqaPSIbsOlKYP9+vlNhfT2P4P09hfBRinF+1+s59X3lqOUwmXU/itt0jUsFjMP/H4MY8/r0UBRCl9QSrE2531WHp+Dhl6l53/F+/OT/ujXXv7fZ/zEy3sWcKT4JCZN/+WzwakMosyhTEwdzq0dL6jc5y878tJ579Ayfso9SJQ5jItTBnJtm+GEmix+/dzGzt0cJsn/DJL8RTBRSvHMawv59LstHp2nUV5FeueN5zHxyiF+iU34zwn7Qbae+oo9+cuwG8VY9Ui62S6gT8xltPDj+PO3fl7OC7u/rfO4CxK788/+12PWm2anw8ZMkr+XJPmLYPLu52uZ+fYP9Srj8fsu58K0rj6KSDRVS7J2cP/Gd906VgNuaD+Ce7rXr9e9Px09dorVa/eTX1CK2ayTmBDNued0Jjw8uPvEyJK+QjRxB4/k8Op7P9arDE2Df77yPf16tKaFLcJHkYmm6H97F6Oh1TK18K8UMDd9Fbd2uoDokOrXWzhRWsiOU9kUlJVi1k10iIqlQ1QcJt2/zQVr1v/MvE/WsX7jQTRNQ9fL505wuQyetZoZd1Efrr16EK1SWvg1jkCT5C9EkHrtgxVQz4o7paCoxMHcLzdwx8TzfBRZ81DiKGP9z0cosjtIaRFN7zbJaJp7k/AEm+25R9hd4NmkQU7DxRdHNnBD6q9z4J+0FzPv5y28u3cjR4vPno/fajJzWZvu3NBlEH1iW9Y77tMppfjf7B9478PVlQlfKYXL9evvkN3uZP5Xm/h2wVaefHQ8A/q182kMjYkkfyGCUM6pIpat2YtRR+c+dxiG4vPvf+K264YTEiJttHVxOJ289N0q5q7aQrH918lm2sXHcM+4EYzp0zmA0fnHmpx96GgYbjz1V1DA6hP7uCF1BEopvji0nYfXf0uRs6zG2gO7y8lnh7bz8cGtXJval7/2H0WUJdQnP8Ocd37kvQ9XA9T6e+MyFIbdyf/9bR4v/vt3dO+a4pPPb2xkkh8hgtCGbek+SfwVCopK2XMg22flNVVlLhdT3vic2cs2VEn8AOkncrn37S+Zt/qnAEXnP4VOO7oXtRr5ZSUYSvHw+m+ZtvoLipyOOpsNKobufXzwJy777nWOFtV/xb49ezN58133p/0trxEwePSJz336e9aYSPIXIgjt+TkLk8l3v76aBrv2Z/qsvKbq4zXbWL03ner6SVds+ccni8nOK2zYwPwswmTx4Jn/V1HmUJ7ctJD39m8C3Fks91eGUmQU53P9orc5ZS/24tN/9en8jR7/vhiGIis7n3UbD9TrsxsrSf5CBKETpwpRPnwiMek6OblFPiuvKVJK8fbyjW4d+/HabX6OpmENjOtQ+UTuLg2NFuYWzN6zzuvPdSlFZkkBj2743usyCgpKWbB4Oy6XZ/ED6LrGp1+4928ebCT5CxGUNHcXeBM+kl9i59CJ3DqfXg2lWP/zkQaJqaH0jWlLakSCR185DY1F6eno9fyiupTiy/QdrMj07gl8154MnE7PEz+UP/1v/indq3Mbu6BJ/rNmzaJPnz5ER0cTHR1NWloa33zzTeX+0tJSpkyZQlxcHJGRkYwfP56srKwARiyE/yTFR/m0Z7nTZZAUL9P9VjAMg3XfbWbuPz/j7cfm8dl/viHjkPt9IpyGd8mmsdI0jds6Xeh2tb2GxgBbF7JLCz3qJFgTk6Yxx8sahMKiutdCqE1paVmTbPcPmt7+rVu35qmnnqJz584opXjzzTe58sor2bRpEz179uTee+/lq6++Yt68edhsNqZOnco111zDihUrAh26ED7XtUOSV9WYtenWMdmn5QUjl9PFpy9+zacvfk12+gl0k46maxhOAwOF5U9pOMy133SZdI0erRIbKOKGc3FKX34uzOb1/UtrPU5DY3BcB5Q9FF3TMHwwj5xLKZYc20eeowSbpfp5A2pitdRvjQOz2VQ5NLApCZrkf/nll1d5/8QTTzBr1ixWr15N69atef3113nvvfcYOXIkALNnz6Z79+6sXr2aYcOGBSJkIfxmUJ92mM2619WZZ4prEUHHdgk+KStYOexlPDb+X6z7ZlPl9AmGy6BiFV0NsK47gmNoa6glGbgMxbXD+vg/4AC4s8sYksNimLVnIScdhZg0HZcy0H+Z/Meih/CbtkO4q+tFnPvFyz5J/BUUsO1kJsOTUz06r03rWK8/U9OgdaumOdlP0CT/07lcLubNm0dRURFpaWls2LCBsrIyRo8eXXlMt27daNu2LatWrao1+dvtdux2e+X7/Px8v8YuhC9ER4Yy9twefLtse50L+dRF1zSuGdsPsw9HDwSjZybPZN23m2udNyl8/TGKu8bjigmt8QZg0nkD6JDofcJp7K5pM5grWg3gh+xdp63qZ6FPTFsuadWPCLOVwjI7x0t924FUQ2Nv/gmvkn+fXq3ZtuOox9X3SsFVl/X36JxgEVTJf+vWraSlpVFaWkpkZCSffvopPXr0YPPmzVgsFmJiYqocn5SURGZm7cOXZsyYwWOPPebHqIXwj1uvO4dFK3fhsju9LkPXNWJtEVx7yQAfRhZ89m85yGI3pkrWHS7i5m4j95LOONrHoGta+bKyhoHFbGLyhYP54+imX9No1k2MTO7JyOSe1e63u7z/TtZE17wv95orBvLTNs87YVqtZsaMrP5nDHb1Sv6HDx8GoE2bNj4Jpi5du3Zl8+bN5OXl8dFHHzFp0iSWLVtWrzKnT5/OtGnTKt/n5+c32M8jRH0kJ0QzbfIonpz5nddlKKX4213jiAjyxUzqa/6s7zGZdVxuNKOYSsqI+3gHztgwLnnxBsLiIkmOiWJsny5EhTXv61gh3Oz7ZXUNpYjwstwR53SmZ49W7Nx1zKOn/9smnUdERNP8N/W4ns/pdPK3v/0Nm81G+/btad++PTabjYceeoiysrK6C6gHi8VCp06dGDhwIDNmzKBv37688MILJCcn43A4yM3NrXJ8VlYWycm1d2KyWq2VIwgqXkIEi0tH9ub315fPne5J539d09A0+NtdlzCoT9Odv9xdi99f7lbiP501307c9hNMHXsOvxnaWxL/acLMIbQK9+3fUgV0i/GuI6XZbGLGY+NJbRfvdue9668dym+uHuTV5wUDj5/877rrLj755BOefvpp0tLSAFi1ahWPPvooOTk5zJo1y+dB1sQwDOx2OwMHDiQkJIRFixYxfvx4AHbv3k16enpljEIEC6UUX+7ZzZubNrE9OxuzrnNhagcmDxxA3+SzFzuZNH4YKUk2/vXfBZS4MSxJ1zRaxITzt7suYbAkfpxlTkoKvBkOppGbLX2EajIooQ2Z6Ttw+ajTn1nT6dEiyevzo6PC+M+zN/Dyq4v4buE2XC6jSv8OXdcwDEVsiwhuuXEEl1/Sr/5BN2IeJ//33nuPuXPnMm7cr+s09+nThzZt2nD99df7LflPnz6dcePG0bZtWwoKCnjvvfdYunQp3333HTabjcmTJzNt2jRiY2OJjo7mrrvuIi0tTXr6i6BiKMWfv/uOT3buqBwmZXe5+GbvHr7as5t/j72Yq3v0OOu8MSO6M6BnW96fv44vFv5EUbEDTaNyeVTnL8MCY23hXHNxf667dECzr+qvoJt0NM2LBRI1MFuCqttUg/pNh758fmi7T8oyaTqXte1R7+aE8DALD9wzjt/fegHfLtjKjyv3kJtXgtlsomWSjXFje5M2tFOz6Pzq8TfXarXSvn37s7anpqZisfi+nadCdnY2N910ExkZGdhsNvr06cN3333HmDFjAHjuuefQdZ3x48djt9sZO3YsM2fO9Fs8QvjDvO3b+GTnDoAqw6Qqnp7+/P13DExJoe0ZnVuhfLje1Jsu4PbfjmD3z1ns3p/FidxCNDSS4qPo1jGJzqlJzeIPmyd0XSe5QxIZP2d5NPm84TRo00RXfPOFtMR2dLElsD//RL2f/g1lcHPXwT6KDGzRYUwYP4QJ44f4rMxgo6nqVqioxd///nd27drF7NmzsVrLnxzsdjuTJ0+mc+fOPPLII34JtKHk5+djs9nIy8uT9n/R4Ma+9Sb7cnJqzEEmTWPywIE8eO55DRpXU/fRs/P57wNvV7tgT03MFjMfHPsv0bEyM2JNtp7M4Jrv59Rrlj8djZu7Duav/UfXfbBwO4e59eR/zTXXVHm/cOFCWrduTd++fQHYsmULDoeDUaNG1SNkIZq3UmcZe3Nyaj3GpRTrjh5toIiaj7G3XMjsh97HYS9z6+lfN+mMmniuJP469I5tyV/6j+LxTQu9Ot+kafSISWJa7/N9HJlwK/nbbLYq7ys61VWQoXFC1J/m5gIoJh/O6S/KRbWI5P43pvDk756v81iTWSexbQK/f/pG/wfWBNzSdQhOZfDPzYvRPJzut09sCm+cP4Ewc/2m6BVncyv5z549299xCNHsWc1m+iW35KeszBr/QOqaxoh20kPfHy787XCUYfD0LS+jDFU+te9pdJOO4TJo07UVM779K9Fx8tTvrtu7DaN/XCvuXz2fw0W5tc75r1M+cdI9vc/j9m7DMOvSR8UfPG7zb+qkzV8E0td79jD1qy+r3acBFpOJZbdOJjEysmEDa0aOH8nh6/8t5ItZ35F/oqBye68R3bhq6jjOuWowIfVcLKa5KjNcLDq6l/f2bWTjiaOUuH6dG0YDUqPiuKp9L67r0JeEMPmOe8PdHCbJ/wyS/EWg/XvFj8xcuxaTplX2kjZpGiZd59UrruD89p7NbS6843K6OJWdh6PEQVRsJFEtPEtGhlFIScmnGK5szCHdCA29xKfLMAc7QykOF+aSX1ZKiG6iXWQLqd73AUn+XpLkLxqDdUeP8vbmzWzOzMBiMjG6Q0cm9u1Lm1/637gMg11HssktKkXXNRJtkXRIipXk0kgYrpMcP345LtdBwAQ4CQu7mpgWL8m/kfArn/b2F0I0rMGtWjG4VauztucUFPPZ6m28v3wzx/OrrprWJSWe68/rz7gBXQmTaumAyi/4Fy5XOuVDB8oXoykp+ZTQsMsICxtX67lCNASPe1L8/PPP/ohDCFGHFTsPcsnfX+elr1eelfgB9mac4LG5C7jyyTkcyDoZgAhFhbKyHYDrjK1mnGW7AhGOEGfxOPl36tSJCy+8kHfeeYfSUm/mwxZCeOrHHQeY+t/PsDudNfaSrth8Ir+IG5+fy6HjpxowQnE6k57M2X9enegm7xamEcLXPE7+GzdupE+fPkybNo3k5GT+8Ic/sHbtWn/EJoQAcgqKuG/2lyiUW/PPuwxFsd3BXf/9zKPlS4XvREXfDYRQ3t4PYMJs7kRY2NWVxxiuk9gLX6c07x84iuehlDxMiYbjdYc/p9PJF198wZw5c/j222/p0qULt956KzfeeCMJCQm+jrPBSIc/0dj87/s1zPxmlUeTo1SY+YerGd69fZVtTsPFmpNb+CbjBw4VHwU0Oka0YVzL8xgU2wuTZqq2rIZUlFfMvi2HyDx4HMNlYIuPolO/9iS0Dp5OjWVlOygo+A+GK5OQkB5ERT+ArscA4LSvovjkzaBKqegQqOktiYj/EN0s8zgI7zVYb3+73c7MmTOZPn06DocDi8XCddddxz//+U9atjx7+dHGTpK/aEycLoOxj73GiWra+Oti0jWGd2/Pf26/qnLbSUcef9/+EoeKj6GjVc65rqNjYNA5sj0P9biD6JCGH2NtGAYrPt/AF7O+56fl1beNJ7WL54o/jmHcLRcQYQtv2AB9RCk7hZlDUCoPOH0iIRMmyxAi4j8IVGiiCXA3h3k9ddL69eu58847admyJc8++yz3338/+/fvZ8GCBRw7dowrr7zS26KFEL/YcTjLq8QP5dX/y3ccwOEs721udzl4dNuLHC7OBKiy2IrxSxLaX5jO4ztm4jTO7KzmX8d+zuL+MU/w+O9eZNvKPTUel5V+gtf+Opdbez/Amm82N1yAPuS0L0epU1RN/AAuXI5VGK7MQIQlmhmPk/+zzz5L7969Oeecczh27BhvvfUWhw4d4vHHHyc1NZVzzz2XOXPmsHHjRn/EK0SzcqqopF7nKwX5xXYAlp9Yz+GSzMpEXx0Dg72Fh1h38qd6fa4ntq/aw51D/8rONfvKY3DVHB8KlKHIyyng4Wue4YN/Vz8bYmOmjPx67RfCFzwe5z9r1ixuvfVWbr755hqr9RMTE3n99dfrHZwQzZ0vFvHR9fIyvjq2FA0NVceydToaX2csIy2+f70/uy6Hdh7lL5c/jaPE4VHnRPXLsW/87QMiY8K59LaR/grR58yWQZRPZnv2z6vpsehmmcFR+J9HT/5Op5OJEydy44031tqeb7FYmDRpUr2DE6K5S7DVr+09xKQTFWbFUAaHio/VmfihvDlgf1F6vT7XHS6ni3/eMgtHaVm9RiXMuv9tju4Lnqpy3dyWkPDrocoqjuX/b416AE2TCZqE/3mU/M1mM8888wzOX9oQhRD+1SUlntTEFm4u9luVSdcYN7AbIaby3vvuJP4KDTHp97dzlrH/p0O1V/O7wXAZzLzvbR9F1TBCbU9gjXoQTU8GNHRzF8JavIQlYmKgQxPNhMdt/iNHjmTZsmX+iEUIcQZN0/jded5Vv7sMxYQRfQHQNZ3kUPeG4GpotApL8uoz3aWU4tOXvvXqpuZMLqfB+gU/kXEg2welNQxNM2GNuoOo5LVEpxwiMnEBIWFXBDos0Yx43OY/btw4HnzwQbZu3crAgQOJiIiosv+KK+QL3BgopShxFeMwHISbw7HoVp+Xv/XUXDKKN9EmMo0eMVfXfZLwyqWDuvPqd6s5VVSCy83qcZOu0b9DK3q1Ta7cdknL85h94JM6awAUiktanlevmOtyaOdRDu/O8Fl5uq7zw8drmXD/ZT4rU4imzOPkf+eddwLlvf7PpGkaLlfDDhESVTkMB2tPrmRJ9vccLTkMlD/J9bb144LEMXSP6uWTSVL2Fyxk7YmZABwuXkVUSEvaRAyrd7nibBGhFl65YzyTXphLaZmzzhsAk67ROi6GZ2+5vMr2kYlpfHZ0IbmOghp7/OvoJIbGMjx+oM/iP5NSBntWvenrQtmzUdYdEcJdHlf7G4ZR40sSf2DlleXy1M5HeOfQ6xwrOVK5XaHYlreFF/c+zduHXsNQ9WtjBcgvO4J22tcn33G03mWKmnVOieede68nOSYKKE/wZ6rY1i81hbfv+S22iNAq+yPMYTzW80/EWKLQzqhw1355xVtb8FjPP2E1WfzycyilUHkPcWTHIkzm+n8PKxiG4tD2I3UfKIQAvEj+b731Fna7/aztDoeDt956yydBVWfGjBkMHjyYqKgoEhMTueqqq9i9e3eVY0pLS5kyZQpxcXFERkYyfvx4srKy/BZTY+IwHLyw559klh4Dzu7cVfGktzLnB+Ydfrfen9cp6iIsenmTT5gpltSo8+tdpqhdh+Q45j90Cy/cdgVDOrepss+s61w8oBtv3/NbXp967VmJv0Lr8GRe6P8Qk9pfRaI1tnJ7UmgCt6b+huf6TScxNM5/P0TZOij9CJdTw9ez9JY5pCOyEO7yeHpfk8lERkYGiYlVV6fKyckhMTHRb0//F198Mb/97W8ZPHgwTqeTv/zlL2zbto0dO3ZU9ju44447+Oqrr5gzZw42m42pU6ei6zorVqxw+3OCdXrf5ceX8G76G24f/3ivZ4m31m8NBrurgFOOA8RaOmIxRdR9gvCpEkcZ+cWl6JqGLSIUi9njVjzKjDJAI0T3/FxvGLnToPQb5r6cxNvPtcZw+e4OoPOAVF5a8XeflSdEMHI3h3n8G6+UqrbN+MiRI9hsNk+Lc9u3335b5f2cOXNITExkw4YNnHfeeeTl5fH666/z3nvvMXJk+YQfs2fPpnv37qxevZphw5pue7RSiiXZ37s1gQuUt+suP7GYq1tNqNfnWk1RJIf1qVcZwnthlhDCLPUbEx6iN/CYcuc+wEWHHkU+TfymEBNdBsrkOEK4y+3k379/fzRNQ9M0Ro0ahfm0pwyXy8WBAwe4+OKL/RJkdfLy8gCIjS2vutywYQNlZWWMHj268phu3brRtm1bVq1aVWPyt9vtVZox8vODb2rNYlcRx0rdb+80MNiRt7XeyV8Ij2nRgEa3fkXousIwfHMD4Cpz0eucrj4pS4jmwO3kf9VVVwGwefNmxo4dS2TkrzOPWSwW2rdvz/jx430eYHUMw+Cee+5h+PDh9OrVC4DMzEwsFgsxMTFVjk1KSiIzs+bZv2bMmMFjjz3mz3D9zm6c3QejLqWGrB0uGp4WdgmqbC3RLZwMH3eSld+2wOXyen2xSuHRYYy4apAPIhSieXA7+T/yyCMAtG/fngkTJhAaWn2HooYwZcoUtm3bxo8//ljvsqZPn860adMq3+fn59OmTZtazmh8wr1ob482B09/hsbI6comt+gDSst2oWsRRIddQkToeWha/RNZkxZ6BRTOAuMEv/l9Bj9+HVv3OXXQNI3f3HMJllD/jFAQoinyuM2/Ys5+h8NBdnY2hlF1uE7btm19E1kNpk6dypdffskPP/xA69atK7cnJyfjcDjIzc2t8vSflZVFcnJyNSWVs1qtWK2+nQCnoYWaQukZ3Yed+dtqXbHtdINj0/wcVdOVV/QJR0/ey69LsurkFr1LqKU/7eLfxmRqEcjwGjVNj4TYd1CnJtOlTzrjb8/i4/8loZR31f+6Sad1l5Zcd59M7iOEJzx+TNm7dy/nnnsuYWFhtGvXjtTUVFJTU2nfvj2pqf7rcKOUYurUqXz66acsXrz4rM8aOHAgISEhLFq0qHLb7t27SU9PJy2t6Se6CxLHuJ34QzQLQ+NG+DmipqnYvoGjJ/8EOClP/sYv/w+ljp84kjMlgNEFB83cDi3+O7SYV7jxoeH0OScU3YsKE5NZJ8IWxiMf3E2IpWFGKwjRVHj8G3PzzTdjNpv58ssvadmypU9mi3PHlClTeO+99/j888+JioqqbMe32WyEhYVhs9mYPHky06ZNIzY2lujoaO666y7S0tKadE//Cr2i+zI0djhrTq6kuqVCT3dDu1sJM4U1TGBNTE7Bq5TfM1c3pNVFkX0ZpY6dhFq6N3BkwUXTTBA6ktDQkfxjvoN/3jKLFZ+vR9M03Bl9rOkaCa3jePzzB2jdueYVRoUQ1fN4nH9ERAQbNmygW7du/oqpWjXdZMyePZubb74ZKJ/k57777uP999/HbrczduxYZs6cWWu1/5mCdZw/gEu5+CD9LX44sRgd/YyaAI0QzcwN7SYzNG54wGIMdjuPdEap4lqO0EmKeYi4qD80WExNgVKKJXNX8sqf3yXvRAG6ST9rtb+KvwEms84Vd1zEpEfGExoe3E12QviauznM4+Q/ePBgnnvuOUaMaJrVxsGc/Csct2ex7PgiduZvw+4qJcoczZC4cxgWN4IwU3igwwtqO490QqmSWo4wkWibTnz0HQ0WU1PiLHOy4vMNrJy/gV1r93H8SA6GoYiMiaDroA70v7AnY244F1t8VKBDFaJR8lvyX7x4MQ899BBPPvkkvXv3JiSk6iQhwZowKzSF5C/851D29RTZV1B9tX+59omfE26VYWdCiIbntxn+KibRGTVqVJXtFTP/yeI+oimLi/oDRfYfathrIjSkJ2EW/62IJ4QQvuBx8l+yZIk/4hAiKESGXUCi7S9k5z0JmCivAdAARYgphTbxrzVYJ1ghhPCWx9X+TZ1U+wt3lDq2cbLwLUod29D1SGzhV2ALvwZdlz4VQojA8Vu1P8Dy5ct59dVX+fnnn5k3bx6tWrXi7bffJjU1tcl2BBTidKGWXqTEPh3oMALK7nBSUFyKUhAVYSW0nosMCSEajsfJ/+OPP+bGG29k4sSJbNy4sXJRnLy8PJ588km+/vprnwcphGgcypwulqzfy4cLN/PTvmNV9nVpm8CEMf0ZM7Sr3AgI0ch5XO3fv39/7r33Xm666SaioqLYsmULHTp0YNOmTYwbN67WRXSCgVT7Nxyn4aLE5SDUZCFENwU6HFELpRQfLtzMa5+vIq+wFF3XMIyqfzp0DQwFEaEWbrhkELdcNhRdl/4PQjQkv1X77969m/POO++s7TabjdzcXE+LE82MoQxWn9jHB4dWs+L4HhQKDRgY24EJ7YZxXmI3zHIj0KgYhuJf7yzm48Vbqmw767hfNhUVlTL7+a/56q8fQ34pyjBIbBPHuEnnMfq35xBpk34RQgSax8k/OTmZffv20b59+yrbf/zxRzp06OCruEQTVOoqY/rmufyQvQuTpqN+mYZYARtPHmD9yZ8Z0KI9zw68gagQmX64sXj5o+VVEn9tTKdKiFqdju5wUUT5OAiA9F0ZvDp9LrMf+4Q///c2hl82wG/xCiHq5vFyGrfffjt33303a9asQdM0jh07xrvvvsv999/PHXfIrGaieoYymL55Lj9m7wbApapO3Wr8ciOw+dQh7tnwNmVG/eeLUMqJy3kUw6htOl5Rm3U70nn76/VuHWvKKyV6xUE0R/m/3ekV/koplAJ7qYPHb5rF6m82+z5YIYTbPH7yf/DBBzEMg1GjRlFcXMx5552H1Wrl/vvv56677vJHjKIBZecVsnTrfrYfzmJfRg6lZU4irCF0bZVAz7bJjOzdkejwUI/LXX1iPz9k76rzOAPF5lOHWJi5jXEpfb35EQCw21dyMud2lDoFmIiK/jNRUQ37/XQpg8IyOxbdRKgpJCjH/3+wYBMmXcNVTTV/FUoRsfEouBS1/pQK0BT/+uPrvLfrGaxhFh9GK4Rwl9fj/B0OB/v27aOwsJAePXoQGRnp69gCoiE6/NlL7Pz0w07yjudTZi8jwhZOu55taNe9tV8+zx0Hs0/xn69WsPinfSil0M/4g2/WdZyGQYjZxGWDujP1knOIj45wu/x71r/FyhN7z3rir46ORg9ba948549e/SwuVybZWSNQqhROW9yoRYtXCAu/wqsy3aWUYuPJdOYeWMvCjB04f/l5E6xRXJ86hKvbDiA+NDh+V7JyCrji/v/hzl8I08libMsPelT+fTNvYcz1ssiUEL7k13H+ABaLhR49enh7erN0dF8GX76ygK9fW0hx/tmLw/Qc3pWrpo5j+NVDCGmgoVJKKd5dtonn5y/HUArjl7/0Zz7pOY3yJFbmdPHF2u0s2LyHhyeMZmz/rnV+hksZrDi+p7Jqvy4Gim15h8lzFGOzeN45zGFfW83KeyZKSxf5NfkXlpVy3/oPWXl8PyZNr3Kjc9xewH92LWbm7iU80vcKrmrb329x+Mr8H7e5vcSu9UgeSgPNzUcJTddY8N5KSf5CBIjXyV+4z1nm5D9TX+Pr/y2qdqnSCjtX72X7it20SLLx6CcP0COt7sRaH0op/vnJUt5fvtmj81yGoqjUwZ/f/JoT+UVMPL/2zlslTofbif90Bc5Sr5K/plW/zGtN232h1FXGH1a/zbZTR4Gz+zQAKBROpfjb5s9QKK5u27g7vaVnnsLdfza91On2sQDKUBw/etK7wIQQ9eZxhz/hGYe9jL9e+iTfvLYYoMbEf/q+vBMF3Hfho6z9ZpNfY5u9aL3Hib9Cxd/5pz9dxveb99R6bJjZUns7cA0izN4la4t1BCZTW8rn3oeKrmfhEb/1qjx3vLpnGdtOHXX7JufRLV9wtPiU3+LxhcJie2VNUF2UF/0ZQizy7CFEoEjy9yPDMHh60ktsWrzNrarTyvNcBq4yJ4+O/xe71+/3S2x7j53gpa9X1LscDfj7BwvJKSiq8RiTpjMkriO6mwlCR6NrVEtaWNzvU1DlfD2C+PiPsVovQNcTMIf0JC7uXSwW/zxp211lfHBwnce1G/MOuteLPlBCre53UnTZPOsEajLrdOrbzpuwhBA+IMnfj1bP38CyD1ei6uopXQ2lwFXm4t+3vuzRjYO7Zny82CflKKDY7uDlr1fWetyEdmluP0UaKH7bPq1ecZnMrYiLf5vklltITPwea+jZE1P5ysKMnRSUlXp0jqEUHx5a75Mhjf4SHxPp9g2bvW0MnlTvuJwGl02+0LvAhBD1Jsnfjz576Rt0k/eX2HAZHNx2mJ2ra69W99TPmTls2H+07uFbbnIZivnrdpJfXHMCHJHYlUGxHdDryBAmTadbdApjW/bxSWwNYXdeJmbN83/ngrJSTpQW+CEi37g4rRsuo+7RGQAq1Iyjjc2tug/dpNN1YCrdB8ukYEIEiiR/PzmyN4NNi7bW2sbvDpNZ54uZ3/koqnJfb9yNycdzrjucLpZuq7mJwqTpPDNgIv1alFf1nnkToP3yvnNUMi8NuhmrKXgWhik1yupxrtOHkfhWj9RkurZLxN2vSlHvljhbhNV6A6CbdOJTWvDwO1OCct4DIZoKSf5+suDNpfV66q/gchos/WAlJYVnDw301tZDGdXOzV4fZl1nW3pWrcdEhoQyc8itzOg3gd4xbars6xrdkkd6j+eNYb+nhdW7tv5AsYXUnvBqEx3i+YRJDWnC6P64/VUx6xQMb4c9NRalaygoH/5n0tF0Dd2kM+KKgby46K/EJcf4MWohRF2ku62fZB067rOyXE4XJzNzadXJN/Pd7z12wutkVROnYbDnWN0/c4hu4qKWfbioZR8KykooKCslwmz1akhfY3Fhcjde2bPMo3N0NHrEpBBnbdwT/lyc1o2vVmxn056j7t0wmnSK+yRT0j2B0GP5tFA6Iwd2JqV9AiOvG0Zsks3/QQsh6hRUT/4//PADl19+OSkpKWiaxmeffVZlv1KKhx9+mJYtWxIWFsbo0aPZu3dvQGItLiipd5V/lfKqmRTIW6UO/1Q1F9s9q/6OCgkjJbxFUCd+gB4xKfSMSamzP8PpDBS/Sx3qx6h8w2w28a8/XUmn1vFud/4D0K1m4ga357XP/syfnrmB39w1VhK/EI1IUCX/oqIi+vbty8svv1zt/qeffpoXX3yRV155hTVr1hAREcHYsWMpLfWsJ7YvhEZYfVLtXyEs0nfVwyFm/yyZaw1pvhVJd3a90O2hfiZNp11ELBelBMcMmZHhVv77lwmM6FfeQa+2/iIV+/p2bsXsh39HfExwNeEI0VwE1V/rcePGMW7cuGr3KaV4/vnneeihh7jyyisBeOutt0hKSuKzzz7jt7/13wQv1YlPicVX/Zk0XaOFD5+aOibHsmH/UZ+VB2DSdTq3jPNpmcHkvKQu/KX3JTy59Ws0ap7szqTpxFkj+G/apKDq1BgeauHfd1/JnvTjfLx4C1+t2I6jrOowRbNJ56KhXfnNqH707JAsHfqEaMSCKvnX5sCBA2RmZjJ69OjKbTabjaFDh7Jq1aoak7/dbsdut1e+z8/P90k8o244j3nPzK93ObpZZ9ilA4mw+e4Jqne7ZDYfyHB7GJc7DMOgR5skn5UXjK5PHUpiaDTP7VjAoaIcTJqOUurX+fE1GN2yOw/2GofNlElu7j9x2FejaeGEhV1BeMTv0PWoQP8YterSNoHpN4/mruvOZev+DPIKS0BBVISVnh1aEhPlm34pQgj/ajLJPzMzE4CkpKoJKCkpqXJfdWbMmMFjjz3m83g69m1P96Gd2b1uX7161htOgyunXOzDyGBMvy7MWbzBp2XqusaFvTv6tMxgNKpld0Ymd2PDyUN8f2w7p+zFWHQTqVHxXNWmP/GhUZSWfM/x7Nsorx8of3ouK9tMUdGbxCd8gckUH9CfwR2R4VbSercPdBhCCC81meTvrenTpzNt2rTK9/n5+bRp06aWM9x31V3jmHHDi16fr2kaSe0T6Deyl0/iqdCrbTLdWiWw59gJt2fdq41J1xjdtzNxUdK+C+X/boPi2jMorv1Z+wyjiFOnplCe9E+/9gqX6zB5eY8QG1t9nxYhhPCVoOrwV5vk5GQAsrKqjjXPysqq3Fcdq9VKdHR0lZevnHdtGv0u7OV1xz9N17jnld+j677/Z/q/ay7wSeKH8vb+P10qS7O6o7RkPkoVUX2vABelJfMxDN80PQkhRE2aTPJPTU0lOTmZRYsWVW7Lz89nzZo1pKXVb554b5lDzDz6yf2079nGoxsATSt/erzvtTsYOKavX2Ib0LE1N5w/wKvV9s5035Xn0To+xgclNX1O1xFqr3Bz4nLVPlmSEELUV1Al/8LCQjZv3szmzZuB8k5+mzdvJj09HU3TuOeee3j88cf54osv2Lp1KzfddBMpKSlcddVVAYs5whbBc8v/wYDR5XPVm8y1XPJfkn5IqIVHP32AiyZd4NfY7r3iXC7s07FeNwA3XjCACSP8c4PSFJlMKUBt8yyYMJkSGyqcWjkNFydKCzhRWtCoFyASQnhOU/5YMs5Pli5dyoUXnr0S2KRJk5gzZw5KKR555BH++9//kpuby4gRI5g5cyZdunRx+zPy8/Ox2Wzk5eX5tAlAKcX2Fbv4fOa3/PDRagynUX4joGkYLgNlKJLaJ3D1XZcwZtL5RMc2TK9vp8vg+fnLeXvpRnRNc6spoHwst8bdl4/gpgsGyJAuDxhGAVmZ/VCqlLOr/k2Ehl1KbOwrgQit0uGik8w9sJaP0zdS5CwfCRNutjC+7UB+234wbSOb75BOIRo7d3NYUCX/huCv5H+6U1m5rP5yA3knCigrLSMiJpz2vdrS78Kefmnfd8fG/Uf412fL2HE4G5OuYxhVp6zRNNA1DZehGNalLX++5gI6JksS8EZJyTecOvn7X95VPFHrmEytfuntH7ghk98e3cb0jR+jULjO+NNg0jQ0NJ4ccA3jWvUOUIRCiNpI8vdSQyT/xmzn4Sy+27yH7elZ7MvIoczlIjTETNdWCfRul8y4gd1ol9Ai0GEGvbKyHRQWvv7rOP/wK4iIuBFdjwlYTCuz93HH6ndQqFrnKtSAmcNuYERi54YKTQjhJkn+XmruyV80T0oprlryEgcKc+pI/eXJv11EHF+MvEuafIRoZNzNYUHV4U+IhrQ99yh/WPUWs3YvoanfI286mc7PhSfqTPxQ3lPhYFEO63MO+T8wIYRfSPIXQUsZRSjnPpRx0i/lP7P9e1Ye38/M3UvZV5Dtl89oLH7M3odJc//PgUnT+TE7MCtmCiHqT5K/CDpK2THy/4HKHoY6cQkqOw3j1B9RrpqncfZG7xatAIixhJMU1rSbgIqcdo+GfGq/nCOECE7NfnpfEXxU7t1gXwpULEykwL4MdfJ6iJuPpkf65HPu6T6Gi1J60To8huiQpr1gTVRIqJsLEpdTv5wjhAhO8uQvgooq2wb2xfya+Cu4wHUMSj7z2WdpmkbPmBRslnCfldlYXZDUFZdyf5VHlzK4IKmrHyMSQviTJH8RXOwrqO1rqxw/NlwsTUivFq3oFp2M7kblv45Gl+gk+rRo3QCRCSH8QZJ/I6aUwmm4/zTWLGi1tVRpQEhDRdLk/KX3pei/TORTE43yyZ6m975EhvkJEcSkzb8RyXfY+XTfdlZmHGLT8QyyigsBCNFNdImJo39iCpeldmNYcpvm+4fXOhIK/lnDTgMtdHSDhtOU9I9ry3+G/o57132Aw+XEOKMXgI5GiG7i2cETql2uWAgRPGSSnzMEYpKfwjI7z278kXd2bcHhcqKhnfWHF8Cs6TiVQWp0C/465ALGtG2eM6wZeY9BybtnbNXB3Ast7j00zRKQuJqKE6UFfJK+kbkH1nHcXgBAvDWSCe0H85t2A4kPbZh1J4QQnpMZ/rzU0Ml/TeZh/rR0PtklRW4tqgPlVa8KuKpDD54YPobIEKtfY2xslDKg+B1U0etgZIAWCWHXoUXehaZHBDq8JsXuKgPAapLmFCGCgSR/LzVk8v/+0F7+uPgzlKLaJ/26mDSNbi0SeH/cb7FZm+ewK6UcQEjzbQYRQojTyPS+jdz6rKPcsfhzDKW8SvwALqXYdeo4tyz4qNl2DNQ0iyR+IYTwkCT/AChxlnHPsi/rXD3NHS6l2JB9jNe2rfNJbEIIIZo+Sf4B8PKW1RwtzD9rvfT6+NfG5RwtzPdZeUIIIZouSf4NrNTp5M2dG72u6j+dyeQiJMSJphkYSvHurs31D1AIIUSTJ8m/gX17aA/5jvotiGI2u0hIzCWl1SmSW+bSqvVJom0FvLNrE65m2vYvhBDCfZL8G9jazMOYPVg69Uy6bpCYlIvV6qzcpmkQGVWKHnmC/Xn+Wd5WCCFE0yHJv4FtOp6B04MFVM4UEVGKrivO7OCuaRARYefHzH31jFAIIURTJ8m/gWUUFdTrfGtoWY37NA125KfXq3whhBBNnyT/BubJsqnVUar2Me16I/onLXO5yC0upczlCnQoQgghTtN4MoUPvfzyy7Rv357Q0FCGDh3K2rVrAx1SpWhL/abiLS62nlXlD5TPEmhAp/A29SrfFzLyCnhk/kIGPfkyw/45i0FPvswj8xeSkVe/Wg8hhBC+0eSS/wcffMC0adN45JFH2LhxI3379mXs2LFkZ2cHOjQAese7t2Z6TUqKLZSUhKBUecKHX/976lQk/RJSfBCl946cymP8q+/y0cZt2J3lT/x2p4uPNm5j/CvvcvhkbkDjE0II0QST/7PPPsvtt9/OLbfcQo8ePXjllVcIDw/njTfeqPZ4u91Ofn5+lZc/9YtvST1yP6Bx4ng0uaciKCsz4XJqlJaEcDw7mtLiMHrEJbpVSnGpgyPHc9l39AQZOfk4ypx1n+SGv3+1mLziUlxG1XkMXIYir7SUv3+1xCefI4QQwnvmQAfgSw6Hgw0bNjB9+vTKbbquM3r0aFatWlXtOTNmzOCxxx5rqBC5rEM3nlq/rJ6laBQWhlFYGFa5xaRpjGnbqdYV/gxDsW5XOh8s2cLyLT9XWUXQGmLisnN6cu0FfejcOsGrqDLzCli+92CN0xe5DMWP+w6SkVdAS5ssCyuEEIHSpJ78T5w4gcvlIikpqcr2pKQkMjMzqz1n+vTp5OXlVb4OHz7s1xhbR9oY2aYjJh8vRuNSipu69a9x/8ptB7nqr7O587lP+PGnn89aPthe5uKz5Vv57WPvcPOMuRzI8Hy+gEMnc+uct1ABh3JOeVy2EEII32lSyd8bVquV6OjoKi9/e3DQ+Wj1q/uvwqRpnNeqPcNT2lW7/7Pl27j7xc84lpMHcFaVfIWK7dsPZjLpyffZvO+oR3FEWi3uHRdav06PQggh6qdJJf/4+HhMJhNZWVlVtmdlZZGcnByQmFQ1i/d0aRHPtAEjfFK+jkaoycy/RoyrdmnbhRv28I+3FmAohbvrCBmGosRextTnP2X/0RNux9I9OZHWMbXfPLWKiaZHsnv9EoQQQvhHk0r+FouFgQMHsmjRospthmGwaNEi0tLSGiSGYsdODuT8lQ2HB7H2UBfWpndkXXpvtmdcw4nCTzFU+bz+d/QZypUdutfr+V9Hw6RrvDbmGpIjzm5Dz8kv4qHXvql2aGBdDKVwlDm5f+Z8jBpqCs6KR9e4d3TtNzX3jh6Orvu2yUMIIYRnmlSHP4Bp06YxadIkBg0axJAhQ3j++ecpKirilltu8evn5pYs40juCxQ5NgEm4NeJbQxVSKFjC4U5mzh46lGSIm8gxTaV5867lCiLlXd2bUZH82ilP5OmERFi4b+jriatZdtqj/l8+XZcLvef+M/kMhTp2bms25XO0B7VNymc6dLeXSktK+PJb5dRZHegaxqGUkRYLUwfez6X9e7mXTBCCCF8pskl/wkTJnD8+HEefvhhMjMz6devH99+++1ZnQB9KSP/NdJPPcmvY/iqm9GufGY/l5HPsfxXyC39gW6Js3ninIsY2boDD/z4LTmlxXXeBJg0DZdSjGrTkSeHjyUhLKLa45wugw+WbD6rY5+nTLrGB0u2uJ38AcYP6MUlvbqyePfPZBcUkhgVyciuHQizhLhdxt78LNbnHKTIaSfMZKFnTAp9W7SptmlDCCGEZzRVXaN0M5afn4/NZiMvL8+tzn8Z+W+QfuofXnySibCQjvRI/gizHkWJs4z5P+9izo4NbD9Z/YREoSYzl3foxo3d+tM3oWWtpf+w5WfufelzL+I6m6bBN0/fTkJMpE/Kq4lSigUZO3h7/yo2nzqMBuiaXt5fAUXHyAQmdhjG1W37Y9ZNfo1FCCGCkbs5rMk9+TekvJIVpJ963MuzXZSU7WP/ifvomvhfwswhXNelN9d16U2Bw872nCyOFOZTZriIDLHQLTaRDtEtMOnuddPYf+wEJl2rsWe/J5SCg5mn/Jr8DWUwY+vXzD24rnIGREXVtRB+LjzO33+az5LMXTwz6DrCzO6NLhBCCFGVJP96OJY/i/Kqfm8TrEFuyQJKyvYRFtKpcmuUxcqwGtrx3VVQbP+litw3FTsFxaU+Kacmz+5YwNyD6wBqbPao2Loiex9/3jCP54dcj0lrUn1WhRCiQchfTi+Vlh0gv3QFFW353jORVfCuL0KqwmL2bbV4iI/LO93uvEze3L/S7eMNFEuz9rAoY6ffYhJCiKZMkr+XyhO2LxKii+OFH+Iyin1Q1q9iIsNwGfW9MflVi6hwn5V1pg8PrvP4CV5H4/0DjWe1RiGECCaS/L2UW7KY6nv1e85QxRTaN/ukrArn9+voqxp/4m0RdGvrn4l5SpwOPj+8uUrbvjsMFOtzDpJemOOXuIQQoimT5O8lp5HbqMtrGRfN8N6pmOo5oY6uaVx3YV/MJv98VTJL87Eb3q8oeKDQ/RkIhRBClJPk7yWlfPPUX1kevllS93QTRvard29/TYMrR/TyUURnc7jq93OX1uPGQQghmitJ/l4y6b5dktas23xaHsCwHu0Y0KVVvZ7+J44ZQLyt+omEfCE6JDSg5wshRHMkyd9LEdY++KbDH4BGWEgXH5X1K13XeObOK2idGOPxDYAGjBzQibuuOdfncZ0uOcxG+4g4r9Y4CDdZ6Nuijc9jEkKIpk6Sv5eSIm/ANx3+TMSEjcRqrn3GPm9FR4Tyxv9NoGf78lUN65oet+Im4YoRvXjy9kv8vgiPpmlM7DDM4/NMms417QYQLhP9CCGEx2SSHy9Fh6ZhNbfF7jxM/brVu0iKuslXYVUrJjKM/z5wLd+t3c3cxZvYeSgbk66hVPnqfSZdQwHKUKT1bM+Ekf1I69muwebRv6x1H/6zazGFZaVuLW6k/fKa0H6wV5+3Z8cxvvpkPfv3ZFJUUIolNISExGhGXtybEaN6YLHIr4UQommTuf3P4Mnc/pkFb3Ho5KN4n/xNWM2t6JuyBK0BZ6rbeSiLb9bs4kReEaX2MiLDrLRKsHH5OT1Iifd93wN3bDl5mFtXzsFpuGq9Aai4HXl64LVc3Mr9johKKZZ8t42P3lnJ/t2ZmEw6Ltevwws1XUMZisjoUC69eiDX3jScqOgwb38cIYQICHdzmCT/M3iS/JVysef4H38Z8+/phDo6uhZKz+SPCbfIMrcA23OPctea9zhuLzxrdUMNDYUi3GThqYHjuTDZ/WvmchnM/Nc3fPnxejRNo66vvK5rJLdqwYyXbiQ5JcbbH0cIIRqcJH8vebqqn8soYc/x3/8y1a+7l9KErlnpmvg60aGet3c3ZWWGi8WZu3jv59VsOnkY9cs17RyVyO86DOWSVn08audXSvHCjC/59rONePJN1006sXGR/OfN24mN9+9qhkII4SuS/L3kafIHMFQZ6SefILvwXRQGNdcCmAAXYSGd6RT/ojzx18FQBiWuMkJNIV4v4PP1Jxt4YcaXXp2rmzS69mjFc6/f2mD9H4QQoj7czWHS298HdC2E9nGP0r/1atrEPIDFlFzNUSbiwi+lR9I8erf8ThK/G3RNJ8Js9TrxG4bigzd/xKtxhIDhUuzceoRd2456V4AQQjRS0q3Zh0JMcaTY/kjL6NspKdtDmZGLUg5MejSh5vaEmFoEOsRmZdO6n8k8lluvMkwmnfnz1tG9d2vfBCWEEI2APPn7gaaZCLd0xxaaRkzY+URZ+0viD4D589ZhMtWvut7lMlj6/Tbyc3276qIQQgSSJH/RZO3efhSXq/5dWlwug0M/H/dBREII0ThI8hdNVnGh3WdlFRaU+qwsIYQINEn+oskymX219gKYQ3xXlhBCBFrQJP8nnniCc845h/DwcGJiYqo9Jj09nUsvvZTw8HASExN54IEHcDplydfmytYi3GdlxfiwLCGECLSgSf4Oh4Nrr72WO+64o9r9LpeLSy+9FIfDwcqVK3nzzTeZM2cODz/8cANHKhqLC8b09MnCRAlJ0XToUt3wTSGECE5Bk/wfe+wx7r33Xnr37l3t/u+//54dO3bwzjvv0K9fP8aNG8c//vEPXn75ZRwORwNHKxqDcVcPrHMq37pomsYV1w3BZAqaXxUhhKhTk/mLtmrVKnr37k1SUlLltrFjx5Kfn8/27dtrPM9ut5Ofn1/lJZqGxGQbQ8/til6P4X4mk8bYK/r7MCohhAi8JpP8MzMzqyR+oPJ9ZmZmjefNmDEDm81W+WrTpo1f4xQN65Y7R2KxmL2envfG31+ALUba+4UQTUtAk/+DDz6Ipmm1vnbt2uXXGKZPn05eXl7l6/Dhw379PNGw2ndM5NF//xazWfe4/f/S8YOYcPMIP0UmhBCBE9Dpfe+77z5uvvnmWo/p0KGDW2UlJyezdu3aKtuysrIq99XEarVitVrd+gwRnPoP6cC//3szf7vnPfLzStB0DWVU3xdA1zUMpbjx9guYeNt5sqCPEKJJCmjyT0hIICEhwSdlpaWl8cQTT5CdnU1iYiIACxYsIDo6mh49evjkM0Tw6tarNW9/eS/Lvt/GZx+s4ec95TeGmkblUr+RUaFces1ALrl6IMmtZDpmIUTTFTQL+6Snp3Py5EnS09NxuVxs3rwZgE6dOhEZGclFF11Ejx49uPHGG3n66afJzMzkoYceYsqUKR492Vf0DpeOf01T2gUdSbugI/v3ZJJ+8DjFhXYsVjMtYiPpM6A9Fmv5r4T8+wshglHF3646RzqpIDFp0iQFnPVasmRJ5TEHDx5U48aNU2FhYSo+Pl7dd999qqyszKPPOXz4cLWfIy95yUte8pJXsLwOHz5ca67TlKrnQOgmxjAMjh07RlRUVL3be/Pz82nTpg2HDx8mOjraRxE2L3IN60euX/3I9as/uYb14+n1U0pRUFBASkoKul5zn/6gqfZvKLqu07q1b9duj46Oli99Pck1rB+5fvUj16/+5BrWjyfXz2az1XlMkxnnL4QQQgj3SPIXQgghmhlJ/n5ktVp55JFHZB6BepBrWD9y/epHrl/9yTWsH39dP+nwJ4QQQjQz8uQvhBBCNDOS/IUQQohmRpK/EEII0cxI8hdCCCGaGUn+fvTyyy/Tvn17QkNDGTp06FmrDopyP/zwA5dffjkpKSlomsZnn31WZb9SiocffpiWLVsSFhbG6NGj2bt3b2CCbYRmzJjB4MGDiYqKIjExkauuuordu3dXOaa0tJQpU6YQFxdHZGQk48ePr1z1UsCsWbPo06dP5UQqaWlpfPPNN5X75fp55qmnnkLTNO65557KbXINa/boo4+etZx9t27dKvf749pJ8veTDz74gGnTpvHII4+wceNG+vbty9ixY8nOzg50aI1OUVERffv25eWXX652/9NPP82LL77IK6+8wpo1a4iIiGDs2LGUlpY2cKSN07Jly5gyZQqrV69mwYIFlJWVcdFFF1FUVFR5zL333sv8+fOZN28ey5Yt49ixY1xzzTUBjLpxad26NU899RQbNmxg/fr1jBw5kiuvvJLt27cDcv08sW7dOl599VX69OlTZbtcw9r17NmTjIyMytePP/5Yuc8v186z5XWEu4YMGaKmTJlS+d7lcqmUlBQ1Y8aMAEbV+AHq008/rXxvGIZKTk5W//rXvyq35ebmKqvVqt5///0ARNj4ZWdnK0AtW7ZMKVV+vUJCQtS8efMqj9m5c6cC1KpVqwIVZqPXokUL9dprr8n180BBQYHq3LmzWrBggTr//PPV3XffrZSS72BdHnnkEdW3b99q9/nr2smTvx84HA42bNjA6NGjK7fpus7o0aNZtWpVACMLPgcOHCAzM7PKtbTZbAwdOlSuZQ3y8vIAiI2NBWDDhg2UlZVVuYbdunWjbdu2cg2r4XK5mDt3LkVFRaSlpcn188CUKVO49NJLq1wrkO+gO/bu3UtKSgodOnRg4sSJpKenA/67drKwjx+cOHECl8tFUlJSle1JSUns2rUrQFEFp8zMTIBqr2XFPvErwzC45557GD58OL169QLKr6HFYiEmJqbKsXINq9q6dStpaWmUlpYSGRnJp59+So8ePdi8ebNcPzfMnTuXjRs3sm7durP2yXewdkOHDmXOnDl07dqVjIwMHnvsMc4991y2bdvmt2snyV+IJmTKlCls27atSnuhcE/Xrl3ZvHkzeXl5fPTRR0yaNIlly5YFOqygcPjwYe6++24WLFhAaGhooMMJOuPGjav8/z59+jB06FDatWvHhx9+SFhYmF8+U6r9/SA+Ph6TyXRWb8ysrCySk5MDFFVwqrheci3rNnXqVL788kuWLFlSZVnq5ORkHA4Hubm5VY6Xa1iVxWKhU6dODBw4kBkzZtC3b19eeOEFuX5u2LBhA9nZ2QwYMACz2YzZbGbZsmW8+OKLmM1mkpKS5Bp6ICYmhi5durBv3z6/ff8k+fuBxWJh4MCBLFq0qHKbYRgsWrSItLS0AEYWfFJTU0lOTq5yLfPz81mzZo1cy18opZg6dSqffvopixcvJjU1tcr+gQMHEhISUuUa7t69m/T0dLmGtTAMA7vdLtfPDaNGjWLr1q1s3ry58jVo0CAmTpxY+f9yDd1XWFjI/v37admypf++f153FRS1mjt3rrJarWrOnDlqx44d6ve//72KiYlRmZmZgQ6t0SkoKFCbNm1SmzZtUoB69tln1aZNm9ShQ4eUUko99dRTKiYmRn3++efqp59+UldeeaVKTU1VJSUlAY68cbjjjjuUzWZTS5cuVRkZGZWv4uLiymP++Mc/qrZt26rFixer9evXq7S0NJWWlhbAqBuXBx98UC1btkwdOHBA/fTTT+rBBx9Umqap77//Xikl188bp/f2V0quYW3uu+8+tXTpUnXgwAG1YsUKNXr0aBUfH6+ys7OVUv65dpL8/eg///mPatu2rbJYLGrIkCFq9erVgQ6pUVqyZIkCznpNmjRJKVU+3O9vf/ubSkpKUlarVY0aNUrt3r07sEE3ItVdO0DNnj278piSkhJ15513qhYtWqjw8HB19dVXq4yMjMAF3cjceuutql27dspisaiEhAQ1atSoysSvlFw/b5yZ/OUa1mzChAmqZcuWymKxqFatWqkJEyaoffv2Ve73x7WTJX2FEEKIZkba/IUQQohmRpK/EEII0cxI8hdCCCGaGUn+QgghRDMjyV8IIYRoZiT5CyGEEM2MJH8hhBCimZHkL4QQQjQzkvyFEEKIZkaSvxDC5x599FH69esX6DCEEDWQ5C+ECJiysrJAhyBEsyTJXwhRhWEYzJgxg9TUVMLCwujbty8fffRR5f6lS5eiaRqLFi1i0KBBhIeHc84557B7924A5syZw2OPPcaWLVvQNA1N05gzZw4AmqYxa9YsrrjiCiIiInj88cfp1KkT//73v6vEsHnzZjRNY9++fdXGuG7dOsaMGUN8fDw2m43zzz+fjRs3+ueCCNEESfIXQlQxY8YM3nrrLV555RW2b9/Ovffeyw033MCyZcuqHPfXv/6VZ555hvXr12M2m7n11lsBmDBhAvfddx89e/YkIyODjIwMJkyYUHneo48+ytVXX83WrVuZPHkyt956K7Nnz65S9uzZsznvvPPo1KlTtTEWFBQwadIkfvzxR1avXk3nzp255JJLKCgo8PHVEKKJqt9ChEKIpqS0tFSFh4erlStXVtk+efJkdf311yulfl2CeeHChZX7v/rqKwWokpISpZRSjzzyiOrbt+9Z5QPqnnvuqbLt6NGjymQyqTVr1iillHI4HCo+Pl7NmTPH7bhdLpeKiopS8+fPd/scIZozefIXQlTat28fxcXFjBkzhsjIyMrXW2+9xf79+6sc26dPn8r/b9myJQDZ2dl1fsagQYOqvE9JSeHSSy/ljTfeAGD+/PnY7XauvfbaGsvIysri9ttvp3PnzthsNqKjoyksLCQ9Pd3tn1WI5swc6ACEEI1HYWEhAF999RWtWrWqss9qtVZ5HxISUvn/mqYB5f0F6hIREXHWtttuu40bb7yR5557jtmzZzNhwgTCw8NrLGPSpEnk5OTwwgsv0K5dO6xWK2lpaTgcjjo/XwghyV8IcZoePXpgtVpJT0/n/PPP97oci8WCy+Vy+/hLLrmEiIgIZs2axbfffssPP/xQ6/ErVqxg5syZXHLJJQAcPnyYEydOeB2vEM2NJH8hRKWoqCjuv/9+7r33XgzDYMSIEeTl5bFixQqio6OZNGmSW+W0b9+eAwcOsHnzZlq3bk1UVNRZNQenM5lM3HzzzUyfPp3OnTuTlpZWa/mdO3fm7bffZtCgQeTn5/PAAw8QFhbm0c8qRHMmbf5CiCr+8Y9/8Le//Y0ZM2bQvXt3Lr74Yr766itSU1PdLmP8+PFcfPHFXHjhhSQkJPD+++/Xec7kyZNxOBzccsstdR77+uuvc+rUKQYMGMCNN97In/70JxITE92OT4jmTlNKqUAHIYQQy5cvZ9SoURw+fJikpKRAhyNEkybJXwgRUHa7nePHjzNp0iSSk5N59913Ax2SEE2eVPsLIQLq/fffp127duTm5vL0008HOhwhmgV58hdCCCGaGXnyF0IIIZoZSf5CCCFEMyPJXwghhGhmJPkLIYQQzYwkfyGEEKKZkeQvhBBCNDOS/IUQQohmRpK/EEII0cz8PxzM9X0qwjh3AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# 设置随机数种子以确保结果的可复现\n", - "np.random.seed(123)\n", - "data = {'a': np.arange(50),\n", - " 'c': np.random.randint(0, 50, 50),\n", - " 'd': np.random.randn(50)}\n", - "data['b'] = data['a'] + 10 * np.random.randn(50)\n", - "data['d'] = np.abs(data['d']) * 100\n", - "\n", - "fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')\n", - "ax.scatter('a', 'b', c='c', s='d', data=data)\n", - "ax.set_xlabel('entry a')\n", - "ax.set_ylabel('entry b')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "具体来说,共有 5 个步骤。\n", - "\n", - "第一步: 构建字典,`a` 为 0,1,2,...,49 五十个数作为横坐标 x,`c` 为五十个随机整数作为画图的颜色,`d` 为五十个随机数作为每个圆点的大小。\n", - "\n", - "第二步: 对 `a` 做变换得到 `b`,作为画图纵坐标 y;由于点的大小不应该为负数,因此用 `np.abs()` 取绝对值。\n", - "\n", - "第三步: 用前述 `plt.subplots()` 方法生成 `fig` 和 `ax`。\n", - "\n", - "第四步: 在 ax 上画点图,写明参数 `x='a', y='b', c='c', s='d',data=data`,c(color) 指明颜色,s(size) 指明大小,data 来自于我们构建的字典,因此参数中使用的时候,相当于使用字典的 `key` 字符串,需要有引号。\n", - "\n", - "第五步: 用 `set_xlabel()` 和 `set_ylabel()` 方法为 x 轴和 y 轴添加文本标签,也就是轴标题。" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_sources/ch-matplotlib/matplotlib-figure-axes.ipynb b/docs/_sources/ch-matplotlib/matplotlib-figure-axes.ipynb deleted file mode 100644 index 56c68199..00000000 --- a/docs/_sources/ch-matplotlib/matplotlib-figure-axes.ipynb +++ /dev/null @@ -1,313 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# `Figure` 和 `Axes`" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 图形 `Figure` \n", - "`Figure` 是 Matplotlib 中的顶层容器,它用于容纳所有子坐标轴(`Axes`)、一组特殊的图元(如标题、图例、色条等)以及嵌套的子图。一个图形可以包含一个或多个子 `Axes`。\n", - "\n", - "以下是一些创建 `Figure` 的示例:\n", - "\n", - "1. 创建一个空白的 `Figure`。" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig = plt.figure()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. 创建一个带有 `Axes` 的 `Figure`。" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "3. 创建一个带有 2x2 `Axes` 的 `Figure`,即一共 4 个 `Axes`。\n", - "\n", - "当存在多个 Axes 时,可以用变量 `axs` 指向各个 Axes,用 `axs[x, y]` 选择一个子图,然后在子图上面作图。" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGiCAYAAADA0E3hAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAABAGUlEQVR4nO3df1CVdd7/8RegHHQS1IifYajdpqUCaRKamS3FqEPr3vdubDpirNqa2Jpnt5RMSC1x23K978IcTbOd1fy16nYng2sUORqN4w/mzvVHq1iwrqDWCooJyvl8/+jr2T0CykHO4VzyfMxcM/Hx8+F6Xxyudy+uc51z/IwxRgAAABbg39YFAAAANBfBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBYDH7dy5U6mpqYqKipKfn5+2bt16wzVFRUW6//77ZbPZdPfdd2v16tUerxOA7yO4APC4mpoaxcXFKS8vr1nzT5w4oTFjxmjkyJEqKSnR888/r8mTJ2v79u0erhSAr/PjQxYBeJOfn5+2bNmisWPHNjln1qxZ2rZtmw4ePOgc+/nPf65z586poKDAC1UC8FUd2rqA5nA4HPrHP/6hLl26yM/Pr63LAdodY4zOnz+vqKgo+ft7/kJtcXGxkpOTXcZSUlL0/PPPN7mmtrZWtbW1zq8dDoe+++473X777fQNoI14ondYIrj84x//UExMTFuXAbR75eXluvPOOz2+n4qKCoWHh7uMhYeHq7q6Wt9//706derUYE1ubq7mzZvn8doAuK81e4clgkuXLl0k/XDgwcHBbVwN0P5UV1crJibGeS76oqysLNntdufXVVVV6tGjB30DaEOe6B2WCC5XL/MGBwfTgIA25K2nXCIiIlRZWekyVllZqeDg4EavtkiSzWaTzWZrME7fANpea/YOXlUEwOckJSWpsLDQZWzHjh1KSkpqo4oA+Aq3gktubq4eeOABdenSRWFhYRo7dqyOHj16w3UbN25U3759FRQUpAEDBig/P7/FBQOwngsXLqikpEQlJSWSfni5c0lJicrKyiT98DRPenq6c/7UqVNVWlqqF198UUeOHNHSpUu1YcMGzZw5sy3KB+BD3Aoun332mTIzM/XFF19ox44dunz5sh5//HHV1NQ0uebzzz/XU089pUmTJunAgQMaO3asxo4d6/IyR9zajDG6WHdFF+uuiFfft0979+5VQkKCEhISJEl2u10JCQnKzs6WJJ06dcoZYiSpZ8+e2rZtm3bs2KG4uDi9+eabevfdd5WSktIm9QPwHTf1Pi5nzpxRWFiYPvvsMz388MONzklLS1NNTY0++ugj59iDDz6o+Ph4LVu2rNE1176s8erNPVVVVTxXbUEX667o3uwf3jjs0PwUdQ60xK1V+DfV1dUKCQmx1DloxZqBW40nzsObuselqqpKktS9e/cm5zT1fgzFxcVNrsnNzVVISIhz46XQAABAuong4nA49Pzzz2vYsGHq379/k/Oaej+GioqKJtdkZWWpqqrKuZWXl7e0TAAAcAtp8TX7zMxMHTx4ULt27WrNeiQ1/bJGAADQvrUouEyfPl0fffSRdu7cecN3wmvq/RgiIiJasmsAANCOufVUkTFG06dP15YtW/TJJ5+oZ8+eN1zD+zEAAIDW4tYVl8zMTK1du1Z//vOf1aVLF+d9KiEhIc53s0xPT1d0dLRyc3MlSTNmzNCIESP05ptvasyYMVq3bp327t2r5cuXt/KhAACAW51bV1zeeecdVVVV6ZFHHlFkZKRzW79+vXNOWVmZTp065fx66NChWrt2rZYvX664uDht2rRJW7duve4NvQAAAI1x64pLc97ypaioqMHYz372M/3sZz9zZ1cAAAAN8FlFAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguAADAMgguALwmLy9PsbGxCgoKUmJiovbs2XPd+UuWLNE999yjTp06KSYmRjNnztSlS5e8VC0AX0RwAeAV69evl91uV05Ojvbv36+4uDilpKTo9OnTjc5fu3atZs+erZycHB0+fFgrV67U+vXr9dJLL3m5cgC+hOACwCsWL16sKVOmKCMjQ/fee6+WLVumzp07a9WqVY3O//zzzzVs2DCNGzdOsbGxevzxx/XUU081eZWmtrZW1dXVLhuAWw/BBYDH1dXVad++fUpOTnaO+fv7Kzk5WcXFxY2uGTp0qPbt2+cMKqWlpcrPz9fo0aMbnZ+bm6uQkBDnFhMT0/oHAqDNuR1cdu7cqdTUVEVFRcnPz09bt2694Zo1a9YoLi5OnTt3VmRkpH7xi1/o22+/bUm9ACzo7Nmzqq+vV3h4uMt4eHi4KioqGl0zbtw4zZ8/Xw899JA6duyo3r1765FHHmnyqaKsrCxVVVU5t/Ly8lY/DgBtz+3gUlNTo7i4OOXl5TVr/u7du5Wenq5Jkybpr3/9qzZu3Kg9e/ZoypQpbhcLoP0oKirSwoULtXTpUu3fv1+bN2/Wtm3btGDBgkbn22w2BQcHu2wAbj0d3F0watQojRo1qtnzi4uLFRsbq1/96leSpJ49e+qXv/ylfvvb37q7awAWFRoaqoCAAFVWVrqMV1ZWKiIiotE1c+fO1YQJEzR58mRJ0oABA1RTU6NnnnlGc+bMkb8/z3QD7ZHHz/ykpCSVl5crPz9fxhhVVlZq06ZNTT5PLXGTHXCrCQwM1KBBg1RYWOgcczgcKiwsVFJSUqNrLl682CCcBAQESJKMMZ4rFoBP83hwGTZsmNasWaO0tDQFBgYqIiJCISEh132qiZvsgFuP3W7XihUr9P777+vw4cN69tlnVVNTo4yMDElSenq6srKynPNTU1P1zjvvaN26dTpx4oR27NihuXPnKjU11RlgALQ/bj9V5K5Dhw5pxowZys7OVkpKik6dOqUXXnhBU6dO1cqVKxtdk5WVJbvd7vy6urqa8AJYXFpams6cOaPs7GxVVFQoPj5eBQUFzht2y8rKXK6wvPzyy/Lz89PLL7+skydP6o477lBqaqpee+21tjoEAD7Az9zENVc/Pz9t2bJFY8eObXLOhAkTdOnSJW3cuNE5tmvXLg0fPlz/+Mc/FBkZecP9VFdXKyQkRFVVVdxwZ0EX667o3uztkqRD81PUOdDjeRmtzIrnoBVrBm41njgPPf5UEc9TAwCA1uJ2cLlw4YJKSkpUUlIiSTpx4oRKSkpUVlYm6YenedLT053zU1NTtXnzZr3zzjsqLS3V7t279atf/UpDhgxRVFRU6xwFAABoF9y+Zr93716NHDnS+fXVe1EmTpyo1atX69SpU84QI0lPP/20zp8/r7ffflu//vWv1bVrVz366KO8HBoAALjN7eDyyCOPXPcpntWrVzcYe+655/Tcc8+5uysAAAAXvIMTAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAK/Jy8tTbGysgoKClJiYqD179lx3/rlz55SZmanIyEjZbDb16dNH+fn5XqoWgC/q0NYFAGgf1q9fL7vdrmXLlikxMVFLlixRSkqKjh49qrCwsAbz6+rq9NhjjyksLEybNm1SdHS0vvnmG3Xt2tX7xQPwGW5fcdm5c6dSU1MVFRUlPz8/bd269YZramtrNWfOHN11112y2WyKjY3VqlWrWlIvAItavHixpkyZooyMDN17771atmyZOnfu3GQvWLVqlb777jtt3bpVw4YNU2xsrEaMGKG4uDgvVw7Al7gdXGpqahQXF6e8vLxmr3nyySdVWFiolStX6ujRo/rggw90zz33uLtrABZVV1enffv2KTk52Tnm7++v5ORkFRcXN7rmww8/VFJSkjIzMxUeHq7+/ftr4cKFqq+vb3R+bW2tqqurXTYAtx63nyoaNWqURo0a1ez5BQUF+uyzz1RaWqru3btLkmJjY6+7pra2VrW1tc6vaUCAtZ09e1b19fUKDw93GQ8PD9eRI0caXVNaWqpPPvlE48ePV35+vo4dO6Zp06bp8uXLysnJaTA/NzdX8+bN80j9AHyHx2/O/fDDDzV48GC9/vrrio6OVp8+ffSb3/xG33//fZNrcnNzFRIS4txiYmI8XSYAH+NwOBQWFqbly5dr0KBBSktL05w5c7Rs2bJG52dlZamqqsq5lZeXe7liAN7g8ZtzS0tLtWvXLgUFBWnLli06e/aspk2bpm+//Vbvvfdeo2uysrJkt9udX1dXVxNeAAsLDQ1VQECAKisrXcYrKysVERHR6JrIyEh17NhRAQEBzrF+/fqpoqJCdXV1CgwMdJlvs9lks9lav3gAPsXjV1wcDof8/Py0Zs0aDRkyRKNHj9bixYv1/vvvN3nVxWazKTg42GUDYF2BgYEaNGiQCgsLnWMOh0OFhYVKSkpqdM2wYcN07NgxORwO59hXX32lyMjIBqEFQPvh8eASGRmp6OhohYSEOMf69esnY4z+/ve/e3r3AHyE3W7XihUr9P777+vw4cN69tlnVVNTo4yMDElSenq6srKynPOfffZZfffdd5oxY4a++uorbdu2TQsXLlRmZmZbHQIAH+Dxp4qGDRumjRs36sKFC7rtttsk/fBXk7+/v+68805P7x6A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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, axs = plt.subplots(2, 2)\n", - "axs[0, 0].plot([1, 1], [1, 2])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "也可以像下面这样获得各个子图。" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGiCAYAAADA0E3hAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAABAPUlEQVR4nO3df1SUdd7/8RegDHoS1IifYaTdZqUBYRKamS3FUQ+te9+7sekRY9PWxNac3VIyIa3Ebcv1vgvzaJrtWc0frbrdycE1ijwWHY8o5671R6tYsK6g1gqKCcp8vn/0dXZHQBlkflzyfJxznRMfP5+Z9zXD9e7FNTPXBBhjjAAAACwg0NcFAAAAtBfBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWAbBBQAAWIbbwWXHjh3KyMhQTEyMAgICtGXLliuuKS0t1V133SWbzaZbbrlFq1ev7kCpAACgq3M7uDQ0NCghIUGFhYXtmn/kyBGNGzdOo0ePVkVFhZ5++mlNmTJF27Ztc7tYAADQtQVczZcsBgQEaPPmzRo/fnybc2bPnq2tW7fqyy+/dI79/Oc/16lTp1RcXNzRuwYAAF1QN0/fQVlZmdLS0lzG0tPT9fTTT7e5prGxUY2Njc6fHQ6HvvvuO11//fUKCAjwVKkA2mCM0enTpxUTE6PAQGu8Nc7hcOgf//iHevXqRd8AfMQTvcPjwaWmpkaRkZEuY5GRkaqvr9f333+vHj16tFhTUFCg+fPne7o0AG6qrq7WjTfe6Osy2uUf//iH4uLifF0GAHVu7/B4cOmI3Nxc2e125891dXXq16+fqqurFRoa6sPKgK6pvr5ecXFx6tWrl69LabeLtdI3AN/xRO/weHCJiopSbW2ty1htba1CQ0NbPdsiSTabTTabrcV4aGgoDQjwISu95HKxVvoG4Hud2Ts8/mJ1amqqSkpKXMa2b9+u1NRUT981AAC4xrgdXM6cOaOKigpVVFRI+uHjzhUVFaqqqpL0w8s8WVlZzvnTpk1TZWWlnn32WR04cEBLly7Vhg0bNGvWrM7ZAwB+r6CgQHfffbd69eqliIgIjR8/XgcPHrziuo0bN2rQoEEKCQnRkCFDVFRU5IVqAfgzt4PL7t27lZSUpKSkJEmS3W5XUlKS8vLyJEnHjh1zhhhJuvnmm7V161Zt375dCQkJeu211/TWW28pPT29k3YBgL/75JNPlJOTo88//1zbt2/X+fPn9dBDD6mhoaHNNZ999pkeffRRPf7449q7d6/Gjx+v8ePHu1xaAdcuY4zONl3Q2aYLuoqrduAadFXXcfGW+vp6hYWFqa6ujteqAR/o7GPwxIkTioiI0CeffKL77ruv1TmZmZlqaGjQBx984By75557lJiYqGXLlrWYf+llFC6+KZC+YU1nmy7o9rwfLlS6b0G6egb75WdJcAWe+P+3NS7IAOCaUldXJ0nq27dvm3PaugZUWVlZq/MLCgoUFhbm3PgoNHBtIrgA8CqHw6Gnn35aI0aM0ODBg9uc19Y1oGpqalqdn5ubq7q6OudWXV3dqXUD8A+cewPgVTk5Ofryyy+1c+fOTr3dti6jAODaQnAB4DUzZszQBx98oB07dlzxKpptXQMqKirKkyUC8HO8VATA44wxmjFjhjZv3qyPPvpIN9988xXXcA0oAK3hjAsAj8vJydHatWv15z//Wb169XK+TyUsLMx5Be2srCzFxsaqoKBAkjRz5kyNGjVKr732msaNG6d169Zp9+7dWr58uc/2A4DvccYFgMe9+eabqqur0/3336/o6Gjntn79euecqqoqHTt2zPnz8OHDtXbtWi1fvlwJCQl67733tGXLlsu+oRfAtY8zLgA8rj2XiyotLW0x9rOf/Uw/+9nPPFARAKvijAsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALAMggsAALCMDgWXwsJCxcfHKyQkRCkpKdq1a9dl5y9ZskS33nqrevToobi4OM2aNUvnzp3rUMEAAKDrcju4rF+/Xna7Xfn5+dqzZ48SEhKUnp6u48ePtzp/7dq1mjNnjvLz87V//36tXLlS69ev13PPPXfVxQMAgK7F7eCyePFiTZ06VdnZ2br99tu1bNky9ezZU6tWrWp1/meffaYRI0ZowoQJio+P10MPPaRHH330smdpGhsbVV9f77IBAAC4FVyamppUXl6utLS0f91AYKDS0tJUVlbW6prhw4ervLzcGVQqKytVVFSksWPHtnk/BQUFCgsLc25xcXHulAkAAK5RbgWXkydPqrm5WZGRkS7jkZGRqqmpaXXNhAkTtGDBAt17773q3r27BgwYoPvvv/+yLxXl5uaqrq7OuVVXV7tTJgA/s2PHDmVkZCgmJkYBAQHasmXLFdesWbNGCQkJ6tmzp6Kjo/WLX/xC3377reeLBeDXPP6potLSUi1cuFBLly7Vnj17tGnTJm3dulUvvvhim2tsNptCQ0NdNgDW1dDQoISEBBUWFrZr/qeffqqsrCw9/vjj+utf/6qNGzdq165dmjp1qocrBeDvurkzOTw8XEFBQaqtrXUZr62tVVRUVKtr5s2bp0mTJmnKlCmSpCFDhqihoUFPPPGE5s6dq8BAPpENXOvGjBmjMWPGtHt+WVmZ4uPj9atf/UqSdPPNN+uXv/ylfvvb33qqRAAW4VZqCA4OVnJyskpKSpxjDodDJSUlSk1NbXXN2bNnW4SToKAgSZIxxt16AXQBqampqq6uVlFRkYwxqq2t1XvvvXfZ98bxpn6ga3D7dIfdbteKFSv0zjvvaP/+/XryySfV0NCg7OxsSVJWVpZyc3Od8zMyMvTmm29q3bp1OnLkiLZv36558+YpIyPDGWAA4N+NGDFCa9asUWZmpoKDgxUVFaWwsLDLvtTEm/qBrsGtl4okKTMzUydOnFBeXp5qamqUmJio4uJi5xt2q6qqXM6wPP/88woICNDzzz+vo0eP6oYbblBGRoZefvnlztsLANeUffv2aebMmcrLy1N6erqOHTumZ555RtOmTdPKlStbXZObmyu73e78ub6+nvACXIMCjAVer6mvr1dYWJjq6up4oy7gA515DAYEBGjz5s0aP358m3MmTZqkc+fOaePGjc6xnTt3auTIkfrHP/6h6Ohor9YM7zvbdEG3522TJO1bkK6ewW7/nQ0/4InjkHfGAvA7vDcOQFsILgA87syZM6qoqFBFRYUk6ciRI6qoqFBVVZWkH17mycrKcs7PyMjQpk2b9Oabb6qyslKffvqpfvWrX2nYsGGKiYnxxS4A8BOcewPgcbt379bo0aOdP198L8rkyZO1evVqHTt2zBliJOmxxx7T6dOn9cYbb+jXv/61evfurQceeICPQwMguADwvPvvv/+yL/GsXr26xdhTTz2lp556yoNVAbAiXioCAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXAB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LUjXvgXp6tE9yNflwI/wHhcAficqKkq1tbUuY7W1tQoNDVWPHj1aXWOz2WSz2bxRHrwgICBAPYP5XxRa4owLAL+TmpqqkpISl7Ht27crNTXVRxUB8BcdCi6FhYWKj49XSEiIUlJStGvXrsvO37hxowYNGqSQkBANGTJERUVFHSoWgDWdOXNGFRUVqqiokPTDx50rKipUVVUl6YeXebKyspzzp02bpsrKSj377LM6cOCAli5dqg0bNmjWrFm+KB+AH3E7uKxfv152u135+fnas2ePEhISlJ6eruPHj7c6/7PPPtOjjz6qxx9/XHv37tX48eM1fvx4ffnll1ddPABr2L17t5KSkpSUlCRJstvtSkpKUl5eniTp2LFjzhAjSTfffLO2bt2q7du3KyEhQa+99preeustPgoNQAHGGOPOgpSUFN1999164403JEkOh0NxcXF66qmnNGfOnBbzMzMz1dDQoA8++MA5ds899ygxMVHLli1r133W19crLCxMdXV1Cg0NdadcAJ3AisegFWsGrjWeOA7deudTU1OTysvLlZub6xwLDAxUWlpam9dXKCsrk91udxlLT0+/7CW/Gxsb1djY6Py5rq5OkrguA+AjF489N//O8amLtdI3AN/xRO9wK7icPHlSzc3NrV5f4cCBA62uaet6DDU1NW3eT0FBgebPn99inOsyAL717bffKiwszNdltMvp06cl0TcAf3D69OlO6x1++Vmz3Nxcl7M0p06d0k033aSqqirLNM36+nrFxcWpurraMqepqdk7rFhzXV2d+vXrp759+/q6lHaLiYlRdXW1evXqpYCAgMvOteJz0hb2xT911X0xxuj06dOKiYnptPt3K7iEh4crKCio1esrREVFtbqmresxtDVfavt6DGFhYZZ7wkNDQ6nZC6jZOwIDrXMFhcDAQN14441urbHic9IW9sU/dcV96ewTDm51oeDgYCUnJ7tcX8HhcKikpKTN6ytwPQYAANBZ3H6pyG63a/LkyRo6dKiGDRumJUuWqKGhQdnZ2ZKkrKwsxcbGqqCgQJI0c+ZMjRo1Sq+99prGjRundevWaffu3Vq+fHnn7gkAALjmuR1cMjMzdeLECeXl5ammpkaJiYkqLi52vgG3qqrK5XTy8OHDtXbtWj3//PN67rnn9B//8R/asmWLBg8e3O77tNlsys/Pt9TlvKnZO6jZO6xYszuupf1jX/wT+9J53L6OCwAAgK9Y5512AACgyyO4AAAAyyC4AAAAyyC4AAAAy/Cb4FJYWKj4+HiFhIQoJSVFu3btuuz8jRs3atCgQQoJCdGQIUNUVFTkpUr/xZ2aV6xYoZEjR6pPnz7q06eP0tLSrriPnuDu43zRunXrFBAQoPHjx3u2wFa4W/OpU6eUk5Oj6Oho2Ww2DRw40Ou/H+7WvGTJEt16663q0aOH4uLiNGvWLJ07d85L1Uo7duxQRkaGYmJiFBAQcNnvEruotLRUd911l2w2m2655RatXr3a43W2xZ3H+/z581qwYIEGDBigkJAQJSQkqLi42GXOCy+8oICAAJdt0KBBLnPOnTunnJwcXX/99bruuuv0X//1Xy0utukP+xIfH99iXwICApSTk+Occ//997f492nTpl3Vfnjqd+pKj48nnhdP7EtBQYHuvvtu9erVSxERERo/frwOHjzoMscqz4vXjxfjB9atW2eCg4PNqlWrzF//+lczdepU07t3b1NbW9vq/E8//dQEBQWZV155xezbt888//zzpnv37uaLL77w25onTJhgCgsLzd69e83+/fvNY489ZsLCwszf//53v635oiNHjpjY2FgzcuRI8+Mf/9g7xf5/7tbc2Nhohg4dasaOHWt27txpjhw5YkpLS01FRYXf1rxmzRpjs9nMmjVrzJEjR8y2bdtMdHS0mTVrltdqLioqMnPnzjWbNm0ykszmzZsvO7+ystL07NnT2O12s2/fPvP666+boKAgU1xc7J2C/427j/ezzz5rYmJizNatW83hw4fN0qVLTUhIiNmzZ49zTn5+vrnjjjvMsWPHnNuJEydcbmfatGkmLi7OlJSUmN27d5t77rnHDB8+3O/25fjx4y77sX37diPJfPzxx845o0aNMlOnTnWZV1dXd1X74onfqfY8Pp54XjyxL+np6ebtt982X375pamoqDBjx441/fr1M2fOnHHOscrz4u3jxS+Cy7Bhw0xOTo7z5+bmZhMTE2MKCgpanf/II4+YcePGuYylpKSYX/7ylx6t89+5W/OlLly4YHr16mXeeecdT5XYQkdqvnDhghk+fLh56623zOTJk70eXNyt+c033zT9+/c3TU1N3iqxBXdrzsnJMQ888IDLmN1uNyNGjPBonW1pTzN79tlnzR133OEylpmZadLT0z1YWevc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ffzxxyorK1NcXJweeughHT169KqLB2Ad9A4AnSHAGGPcWZCSkqK7775bb7zxhiTJ4XAoLi5OTz31lObMmXPF9c3NzerTp4/eeOMNZWVltes+6+vrFRYWprq6OoWGhrpTLoBO0BnHoLd7B30D8D1PHIdunXFpampSeXm50tLS/nUDgYFKS0tTWVlZu27j7NmzOn/+vPr27dvmnMbGRtXX17tsAKzLG72DvgF0DW4Fl5MnT6q5uVmRkZEu45GRkaqpqWnXbcyePVsxMTEuDexSBQUFCgsLc25xcXHulAnAz3ijd9A3gK7Bq58qWrRokdatW6fNmzcrJCSkzXm5ubmqq6tzbtXV1V6sEoC/aU/voG8AXUM3dyaHh4crKChItbW1LuO1tbWKioq67NpXX31VixYt0ocffqg777zzsnNtNptsNps7pQHwY97oHfQNoGtw64xLcHCwkpOTVVJS4hxzOBwqKSlRampqm+teeeUVvfjiiyouLtbQoUM7Xi0AS6J3AOgsbp1xkSS73a7Jkydr6NChGjZsmJYsWaKGhgZlZ2dLkrKyshQbG6uCggJJ0m9/+1vl5eVp7dq1io+Pd76efd111+m6667rxF0B4M/oHQA6g9vBJTMzUydOnFBeXp5qamqUmJio4uJi55vuqqqqFBj4rxM5b775ppqamvTTn/7U5Xby8/P1wgsvXF31ACyD3gGgM7h9HRdf4HoMgG9Z8Ri0Ys3Atcbn13EBAADwJYILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwjA4Fl8LCQsXHxyskJEQpKSnatWvXZedv3LhRgwYNUkhIiIYMGaKioqIOFQvA2ugdAK6W28Fl/fr1stvtys/P1549e5SQkKD09HQdP3681fmfffaZHn30UT3++OPau3evxo8fr/Hjx+vLL7+86uIBWAe9A0BnCDDGGHcWpKSk6O6779Ybb7whSXI4HIqLi9NTTz2lOXPmtJifmZmphoYGffDBB86xe+65R4mJiVq2bFmr99HY2KjGxkbnz3V1derXr5+qq6sVGhrqTrkAOkF9fb3i4uJ06tQphYWFdeg2PN076BuA/+mM3tGCcUNjY6MJCgoymzdvdhnPysoyDz/8cKtr4uLizO9//3uXsby8PHPnnXe2eT/5+flGEhsbm59thw8fdqdleLV30DfY2Px362jvaE03ueHkyZNqbm5WZGSky3hkZKQOHDjQ6pqamppW59fU1LR5P7m5ubLb7c6fT506pZtuuklVVVWdl9g87GLKtNJfe9TsHVas+eLZi759+3ZovTd6B33DN6xYs2TNuq1Y89X2jta4FVy8xWazyWaztRgPCwuzzJN1UWhoKDV7ATV7R2Cg/34Qkb7hW1asWbJm3VasuTN7h1u3FB4erqCgINXW1rqM19bWKioqqtU1UVFRbs0HcO2hdwDoLG4Fl+DgYCUnJ6ukpMQ55nA4VFJSotTU1FbXpKamusyXpO3bt7c5H8C1h94BoNO4+6aYdevWGZvNZlavXm327dtnnnjiCdO7d29TU1NjjDFm0qRJZs6cOc75n376qenWrZt59dVXzf79+01+fr7p3r27+eKLL9p9n+fOnTP5+fnm3Llz7pbrM9TsHdTsHZ1Rs7d7R1d9nL3NijUbY826qfkHbgcXY4x5/fXXTb9+/UxwcLAZNmyY+fzzz53/NmrUKDN58mSX+Rs2bDADBw40wcHB5o477jBbt269qqIBWBO9A8DVcvs6LgAAAL7ivx8RAAAAuATBBQAAWAbBBQAAWAbBBQAAWIbfBBcrft29OzWvWLFCI0eOVJ8+fdSnTx+lpaVdcR89wd3H+aJ169YpICBA48eP92yBrXC35lOnTiknJ0fR0dGy2WwaOHCg138/3K15yZIluvXWW9WjRw/FxcVp1qxZOnfunJeqlXbs2KGMjAzFxMQoICBAW7ZsueKa0tJS3XXXXbLZbLrlllu0evVqj9d5KfqGd9A3vMdKvcNnfcPXH2sy5ofrOwQHB5tVq1aZv/71r2bq1Kmmd+/epra2ttX5n376qQkKCjKvvPKK2bdvn3n++efdvjaMt2ueMGGCKSwsNHv37jX79+83jz32mAkLCzN///vf/bbmi44cOWJiY2PNyJEjzY9//GPvFPv/uVtzY2OjGTp0qBk7dqzZuXOnOXLkiCktLTUVFRV+W/OaNWuMzWYza9asMUeOHDHbtm0z0dHRZtasWV6ruaioyMydO9ds2rTJSGrxZYiXqqysND179jR2u93s27fPvP766yYoKMgUFxd7p2BD3/DXmi+ib3i+bl/3Dl/1Db8ILsOGDTM5OTnOn5ubm01MTIwpKChodf4jjzxixo0b5zKWkpJifvnLX3q0zn/nbs2XunDhgunVq5d55513PFViCx2p+cKFC2b48OHmrbfeMpMnT/Z6A3K35jfffNP079/fNDU1eavEFtytOScnxzzwwAMuY3a73YwYMcKjdbalPQ3o2WefNXfccYfLWGZmpklPT/dgZa7oG95B3/AeK/cOb/YNn79U1NTUpPLycqWlpTnHAgMDlZaWprKyslbXlJWVucyXpPT09Dbnd7aO1Hyps2fP6vz58536jZmX09GaFyxYoIiICD3++OPeKNNFR2p+//33lZqaqpycHEVGRmrw4MFauHChmpub/bbm4cOHq7y83HlKuLKyUkVFRRo7dqxXau4IKx6DVqz5UvSNK7Ni35C6Ru/orGPQ598O7Y2vu+9sHan5UrNnz1ZMTEyLJ9FTOlLzzp07tXLlSlVUVHihwpY6UnNlZaU++ugjTZw4UUVFRTp06JCmT5+u8+fPKz8/3y9rnjBhgk6ePKl7771XxhhduHBB06ZN03PPPefxejuqrWOwvr5e33//vXr06OHR+6dv0DfaYsW+IXWN3tFZfcPnZ1y6okWLFmndunXavHmzQkJCfF1Oq06fPq1JkyZpxYoVCg8P93U57eZwOBQREaHly5crOTlZmZmZmjt3rpYtW+br0tpUWlqqhQsXaunSpdqzZ482bdqkrVu36sUXX/R1afAj9A3PsWLfkLpu7/D5GRcrft19R2q+6NVXX9WiRYv04Ycf6s477/RkmS7crfnw4cP6+uuvlZGR4RxzOBySpG7duungwYMaMGCAX9UsSdHR0erevbuCgoKcY7fddptqamrU1NSk4OBgv6t53rx5mjRpkqZMmSJJGjJkiBoaGvTEE09o7ty5Cgz0v78v2joGQ0NDPX62RaJveAt9wzt9Q+oavaOz+obP98qKX3ffkZol6ZVXXtGLL76o4uJiDR061BulOrlb86BBg/TFF1+ooqLCuT388MMaPXq0KioqFBcX53c1S9KIESN06NAhZ7OUpK+++krR0dFeaT4dqfns2bMtGszFBmr89KvErHgMWrFmib7h6Zol3/cNqWv0jk47Bt16K6+HePvr7n1R86JFi0xwcLB57733zLFjx5zb6dOn/bbmS/ni0wHu1lxVVWV69eplZsyYYQ4ePGg++OADExERYV566SW/rTk/P9/06tXLvPvuu6aystL85S9/MQMGDDCPPPKI12o+ffq02bt3r9m7d6+RZBYvXmz27t1rvvnmG2OMMXPmzDGTJk1yzr/4scZnnnnG7N+/3xQWFvrk49D0Df+r+VL0Dc/V7eve4au+4RfBxRhrft29OzXfdNNNRlKLLT8/329rvpQvGpAx7tf82WefmZSUFGOz2Uz//v3Nyy+/bC5cuOC3NZ8/f9688MILZsCAASYkJMTExcWZ6dOnm3/+859eq/fjjz9u9ffzYp2TJ082o0aNarEmMTHRBAcHm/79+5u3337ba/VeRN/wv5ovRd9wj5V6h6/6RoAxfng+CQAAoBU+f48LAABAexFcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZRBcAACAZfw/+piF+jHgdp0AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)\n", - "ax2.plot([1, 1], [1, 2])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "4. 创建一个带有一个左侧 `Axes` 和两个右侧 `Axes` 的 `Figure`。\n", - "\n", - "这里我们使用了 `subplot_mosaic()` 方法,它可以设置更复杂的布局。" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGiCAYAAADA0E3hAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA1pklEQVR4nO3df0xUZ6L/8Q+gDDYVtMsyIHdaVnutbf1BC5VFa5puZku2DV3/2JSrDbDGH6uljXWyW6Eq1NqK22tdkoolZXXb5LaLXaNNUwhuy5Y0VvaaBUncrT9i0eKazijXdcbFCso83z/6dXYpoA4yP468X8n5g8fncD7Tep58PDNnTowxxggAAMACYiMdAAAA4EZRXAAAgGVQXAAAgGVQXAAAgGVQXAAAgGVQXAAAgGVQXAAAgGVQXAAAgGVQXAAAgGVQXAAAgGUEXVw+++wz5efna9KkSYqJidEHH3xw3X2am5v14IMPymaz6e6779bbb789jKgArIp1A8BICbq4dHd3a9asWaqurr6h+SdOnNATTzyhRx99VO3t7Xr++ee1ZMkS7d27N+iwAKyJdQPASIm5mYcsxsTEaM+ePZo/f/6Qc1avXq36+nr99a9/DYz913/9l86fP6/GxsbhHhqARbFuALgZY0J9gJaWFjmdzn5jeXl5ev7554fcp6enRz09PYGf/X6/zp07p+9973uKiYkJVVQAQzDG6MKFC5o0aZJiY0P/0TjWDeDWEIq1I+TFxe12y2639xuz2+3y+Xz65ptvNG7cuAH7VFZWav369aGOBiBIp06d0n/8x3+E/DisG8CtZSTXjpAXl+EoKyuTy+UK/Oz1enXnnXfq1KlTSkxMjGAyYHTy+XxyOBwaP358pKMMiXUDiD6hWDtCXlxSU1Pl8Xj6jXk8HiUmJg76ryZJstlsstlsA8YTExNZgIAICtdbLqwbwK1lJNeOkL9ZnZubq6ampn5jH3/8sXJzc0N9aAAWxboBYChBF5d//vOfam9vV3t7u6Rvb1tsb29XZ2enpG8v1xYVFQXmL1++XB0dHXrhhRd05MgRbdu2Te+//75WrVo1Mq8AQNRj3QAwYkyQPv30UyNpwFZcXGyMMaa4uNg88sgjA/bJzMw08fHxZvLkyeZ3v/tdUMf0er1GkvF6vcHGBTACbvYcZN0ARqdQnIc39T0u4eLz+ZSUlCSv18t71UAEWPEctGJm4FYTivOQZxUBAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgAAADLoLgACIvq6mplZGQoISFBOTk5OnDgwDXnV1VV6Z577tG4cePkcDi0atUqXbp0KUxpAUQriguAkNu5c6dcLpcqKirU1tamWbNmKS8vT2fOnBl0/nvvvafS0lJVVFTo8OHD2r59u3bu3KkXX3wxzMkBRBuKC4CQ27Jli5YuXapFixbpvvvuU01NjW677Tbt2LFj0Pn79+/X3LlztXDhQmVkZOixxx7TggULrnmVpqenRz6fr98G4NZDcQEQUr29vWptbZXT6QyMxcbGyul0qqWlZdB95syZo9bW1kBR6ejoUENDgx5//PEhj1NZWamkpKTA5nA4RvaFAIgKYyIdAMCtraurS319fbLb7f3G7Xa7jhw5Mug+CxcuVFdXlx5++GEZY3TlyhUtX778mm8VlZWVyeVyBX72+XyUF+AWxBUXAFGnublZGzdu1LZt29TW1qbdu3ervr5eGzZsGHIfm82mxMTEfhuAWw9XXACEVHJysuLi4uTxePqNezwepaamDrrPunXrVFhYqCVLlkiSZsyYoe7ubi1btkxr1qxRbCz/5gJGK85+ACEVHx+vrKwsNTU1Bcb8fr+ampqUm5s76D4XL14cUE7i4uIkScaY0IUFEPW44gIg5Fwul4qLi5Wdna3Zs2erqqpK3d3dWrRokSSpqKhI6enpqqyslCTl5+dry5YteuCBB5STk6Pjx49r3bp1ys/PDxQYAKMTxQVAyBUUFOjs2bMqLy+X2+1WZmamGhsbAx/Y7ezs7HeFZe3atYqJidHatWt1+vRpff/731d+fr5effXVSL0EAFEixljguqvP51NSUpK8Xi8fuAMiwIrnoBUzA7eaUJyHfMYFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABYBsUFAABY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X9Ydd9wx5JzKykolJSUFNofDEUxMAABwiwqquHR1damvr092u73fuN1ul9vtvqHfsXr1ak2aNKlf+fmusrIyeb3ewHbq1KlgYgIAgFvUmHAebNOmTaqrq1Nzc7MSEhKGnGez2WSz2cKYDAAAWEFQV1ySk5MVFxcnj8fTb9zj8Sg1NfWa+27evFmbNm3SH//4R82cOTP4pAAsL5g7Ev9dXV2dYmJiNH/+/NAGBBD1giou8fHxysrKUlNTU2DM7/erqalJubm5Q+732muvacOGDWpsbFR2dvbw0wKwrGDvSLzq5MmT+uUvf6l58+aFKSmAaBb07dAul0u1tbV65513dPjwYa1YsULd3d1atGiRJKmoqEhlZWWB+b/+9a+1bt067dixQxkZGXK73XK73frnP/85cq8CQNTbsmWLli5dqkWLFum+++5TTU2NbrvtNu3YsWPIffr6+vT0009r/fr1mjx5chjTAohWQReXgoICbd68WeXl5crMzFR7e7saGxsDH9jt7OzU119/HZj/5ptvqre3Vz/72c+UlpYW2DZv3jxyrwJAVBvuHYkvv/yyUlJStHjx4useo6enRz6fr98G4NYzrA/nPvvss3r22WcH/bPm5uZ+P588eXI4hwBwC7nWHYlHjhwZdJ99+/Zp+/btam9vv6FjVFZWav369TcbFUCU41lFAKLOhQsXVFhYqNraWiUnJ9/QPnyNAjA6hPV2aACjU7B3JH755Zc6efKk8vPzA2N+v1+SNGbMGB09elRTpkzptw9fowCMDlxxARBywd6ROG3aNB06dEjt7e2B7cknn9Sjjz6q9vZ2vk0bGMW44gIgLFwul4qLi5Wdna3Zs2erqqpqwB2J6enpqqysVEJCgqZPn95v/wkTJkjSgHEAowvFBUBYFBQU6OzZsyovL5fb7VZmZuaAOxJjY7kIDODagn46dCTwlFcgsqx4DloxM3CrifjToQEAACKJ4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIAACyD4gIgbKqrq5WRkaGEhATl5OTowIEDQ86tra3VvHnzNHHiRE2c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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, axs = plt.subplot_mosaic([['left', 'right_top'], ['left', 'right_bottom']])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "5. 创建一个尺寸大小为 5*2.7 的 Figure,布局参数 layout 设置为 `constrained`。\n", - "\n", - "`figsize` 和 `layout` 是 `Figure` 对象的参数,`figsize` 用来指定画布大小,`layout` 用于指定绘图中的元素布局机制,以避免重叠的坐标轴装饰(例如标签、刻度等)。\n", - "\n", - "具体来说,`layout` 参数有:\n", - "- `constrained`(默认值):约束布局(Constrained Layout)机制会自动调整坐标轴的大小,以避免坐标轴装饰重叠。它适用于复杂的绘图布局,可以处理具有多个坐标轴和色条的情况,通常是推荐的选项。\n", - "\n", - "- `compressed`:使用与 `constrained` 相同的算法,但去除了固定纵横比坐标轴之间的额外间隔。最适合简单的坐标轴网格。\n", - "\n", - "- `tight`:使用紧凑布局机制,这是一个相对简单的算法,调整子图参数以避免装饰重叠。\n", - "\n", - "- `none`:不应用特定的布局机制,子图的布局将遵循默认行为。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf8AAAEZCAYAAACZ7CwhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAZaElEQVR4nO3df2zU9eHH8VdbuCtGWnBdr6U77cAhKkixlVtBYlxuNpHU8cdiB4Z2jT+mdka5bEIFWhGlzClpIsVG1OEfuqJGjJGmDm8So3YhFproBAwWbWe8g85xx4q20Ht//1g8v7Ut9lN6V8v7+UjuD957v+/zvvcan73rXZtijDECAADWSB3vDQAAgOQi/gAAWIb4AwBgGeIPAIBliD8AAJYh/gAAWIb4AwBgGeIPAIBliD8AAJYh/gAAWMZx/N9++22VlpZqxowZSklJ0auvvvq9a/bu3aurr75abrdbl156qXbs2DGKrQIAgLHgOP49PT2aP3++GhoaRjT/6NGjWrp0qa6//nq1t7frvvvu02233aY33njD8WYBAMC5SzmXP+yTkpKiXbt2admyZcPOWb16tXbv3q0PP/wwPvab3/xGJ06cUEtLy2gvDQAARmlSoi/Q2toqv98/YKykpET33XffsGt6e3vV29sb/3csFtOXX36pH/3oR0pJSUnUVgEA+MExxujkyZOaMWOGUlPH5q16CY9/KBSSx+MZMObxeBSNRvXVV19pypQpg9bU1dVpw4YNid4aAAATRldXl37yk5+MyX0lPP6jUV1drUAgEP93JBLRxRdfrK6uLmVkZIzjzgAASK5oNCqv16upU6eO2X0mPP45OTkKh8MDxsLhsDIyMoZ81i9Jbrdbbrd70HhGRgbxBwBYaSx/7J3wz/kXFxcrGAwOGNuzZ4+Ki4sTfWkAADAEx/H/73//q/b2drW3t0v630f52tvb1dnZKel/L9mXl5fH5995553q6OjQ/fffr0OHDmnbtm168cUXtWrVqrF5BAAAwBHH8X///fe1YMECLViwQJIUCAS0YMEC1dTUSJK++OKL+DcCkvTTn/5Uu3fv1p49ezR//nw9/vjjevrpp1VSUjJGDwEAADhxTp/zT5ZoNKrMzExFIhF+5g8AsEoiGsjv9gcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsM6r4NzQ0KD8/X+np6fL5fNq3b99Z59fX1+uyyy7TlClT5PV6tWrVKn399dej2jAAADg3juO/c+dOBQIB1dbWav/+/Zo/f75KSkp07NixIee/8MILWrNmjWpra3Xw4EE988wz2rlzpx544IFz3jwAAHDOcfy3bNmi22+/XZWVlbriiivU2NioCy64QM8+++yQ89977z0tXrxYK1asUH5+vm644QYtX778e18tAAAAieEo/n19fWpra5Pf7//2DlJT5ff71draOuSaRYsWqa2tLR77jo4ONTc368Ybbxz2Or29vYpGowNuAABgbExyMrm7u1v9/f3yeDwDxj0ejw4dOjTkmhUrVqi7u1vXXnutjDE6c+aM7rzzzrO+7F9XV6cNGzY42RoAABihhL/bf+/evdq0aZO2bdum/fv365VXXtHu3bu1cePGYddUV1crEonEb11dXYneJgAA1nD0zD8rK0tpaWkKh8MDxsPhsHJycoZcs379eq1cuVK33XabJGnevHnq6enRHXfcobVr1yo1dfD3H263W26328nWAADACDl65u9yuVRYWKhgMBgfi8ViCgaDKi4uHnLNqVOnBgU+LS1NkmSMcbpfAABwjhw985ekQCCgiooKFRUVaeHChaqvr1dPT48qKyslSeXl5crLy1NdXZ0kqbS0VFu2bNGCBQvk8/l05MgRrV+/XqWlpfFvAgAAQPI4jn9ZWZmOHz+umpoahUIhFRQUqKWlJf4mwM7OzgHP9NetW6eUlBStW7dOn3/+uX784x+rtLRUjzzyyNg9CgAAMGIpZgK89h6NRpWZmalIJKKMjIzx3g4AAEmTiAbyu/0BALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsM6r4NzQ0KD8/X+np6fL5fNq3b99Z5584cUJVVVXKzc2V2+3W7Nmz1dzcPKoNAwCAczPJ6YKdO3cqEAiosbFRPp9P9fX1Kikp0eHDh5WdnT1ofl9fn375y18qOztbL7/8svLy8vTZZ59p2rRpY7F/AADgUIoxxjhZ4PP5dM0112jr1q2SpFgsJq/Xq3vuuUdr1qwZNL+xsVF//vOfdejQIU2ePHlUm4xGo8rMzFQkElFGRsao7gMAgIkoEQ109LJ/X1+f2tra5Pf7v72D1FT5/X61trYOuea1115TcXGxqqqq5PF4NHfuXG3atEn9/f3DXqe3t1fRaHTADQAAjA1H8e/u7lZ/f788Hs+AcY/Ho1AoNOSajo4Ovfzyy+rv71dzc7PWr1+vxx9/XA8//PCw16mrq1NmZmb85vV6nWwTAACcRcLf7R+LxZSdna2nnnpKhYWFKisr09q1a9XY2DjsmurqakUikfitq6sr0dsEAMAajt7wl5WVpbS0NIXD4QHj4XBYOTk5Q67Jzc3V5MmTlZaWFh+7/PLLFQqF1NfXJ5fLNWiN2+2W2+12sjUAADBCjp75u1wuFRYWKhgMxsdisZiCwaCKi4uHXLN48WIdOXJEsVgsPvbxxx8rNzd3yPADAIDEcvyyfyAQ0Pbt2/Xcc8/p4MGDuuuuu9TT06PKykpJUnl5uaqrq+Pz77rrLn355Ze699579fHHH2v37t3atGmTqqqqxu5RAACAEXP8Of+ysjIdP35cNTU1CoVCKigoUEtLS/xNgJ2dnUpN/fZ7Cq/XqzfeeEOrVq3SVVddpby8PN17771avXr12D0KAAAwYo4/5z8e+Jw/AMBW4/45fwAAMPERfwAALEP8AQCwDPEHAMAyxB8AAMsQfwAALEP8AQCwDPEHAMAyxB8AAMsQfwAALEP8AQCwDPEHAMAyxB8AAMsQfwAALEP8AQCwDPEHAMAyxB8AAMsQfwAALEP8AQCwDPEHAMAyxB8AAMsQfwAALEP8AQCwDPEHAMAyxB8AAMsQfwAALEP8AQCwDPEHAMAyxB8AAMsQfwAALEP8AQCwDPEHAMAyxB8AAMsQfwAALEP8AQCwzKji39DQoPz8fKWnp8vn82nfvn0jWtfU1KSUlBQtW7ZsNJcFAABjwHH8d+7cqUAgoNraWu3fv1/z589XSUmJjh07dtZ1n376qf7whz9oyZIlo94sAAA4d47jv2XLFt1+++2qrKzUFVdcocbGRl1wwQV69tlnh13T39+vW265RRs2bNDMmTPPacMAAODcOIp/X1+f2tra5Pf7v72D1FT5/X61trYOu+6hhx5Sdna2br311hFdp7e3V9FodMANAACMDUfx7+7uVn9/vzwez4Bxj8ejUCg05Jp33nlHzzzzjLZv3z7i69TV1SkzMzN+83q9TrYJAADOIqHv9j958qRWrlyp7du3Kysra8TrqqurFYlE4reurq4E7hIAALtMcjI5KytLaWlpCofDA8bD4bBycnIGzf/kk0/06aefqrS0ND4Wi8X+d+FJk3T48GHNmjVr0Dq32y232+1kawAAYIQcPfN3uVwqLCxUMBiMj8ViMQWDQRUXFw+aP2fOHH3wwQdqb2+P32666SZdf/31am9v5+V8AADGgaNn/pIUCARUUVGhoqIiLVy4UPX19erp6VFlZaUkqby8XHl5eaqrq1N6errmzp07YP20adMkadA4AABIDsfxLysr0/Hjx1VTU6NQKKSCggK1tLTE3wTY2dmp1FR+cSAAAD9UKcYYM96b+D7RaFSZmZmKRCLKyMgY7+0AAJA0iWggT9EBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsQ/wBALAM8QcAwDLEHwAAyxB/AAAsM6r4NzQ0KD8/X+np6fL5fNq3b9+wc7dv364lS5Zo+vTpmj59uvx+/1nnAwCAxHIc/507dyoQCKi2tlb79+/X/PnzVVJSomPHjg05f+/evVq+fLneeusttba2yuv16oYbbtDnn39+zpsHAADOpRhjjJMFPp9P11xzjbZu3SpJisVi8nq9uueee7RmzZrvXd/f36/p06dr69atKi8vH9E1o9GoMjMzFYlElJGR4WS7AABMaIlooKNn/n19fWpra5Pf7//2DlJT5ff71draOqL7OHXqlE6fPq2LLrpo2Dm9vb2KRqMDbgAAYGw4in93d7f6+/vl8XgGjHs8HoVCoRHdx+rVqzVjxowB30B8V11dnTIzM+M3r9frZJsAAOAskvpu/82bN6upqUm7du1Senr6sPOqq6sViUTit66uriTuEgCA89skJ5OzsrKUlpamcDg8YDwcDisnJ+esax977DFt3rxZb775pq666qqzznW73XK73U62BgAARsjRM3+Xy6XCwkIFg8H4WCwWUzAYVHFx8bDrHn30UW3cuFEtLS0qKioa/W4BAMA5c/TMX5ICgYAqKipUVFSkhQsXqr6+Xj09PaqsrJQklZeXKy8vT3V1dZKkP/3pT6qpqdELL7yg/Pz8+HsDLrzwQl144YVj+FAAAMBIOI5/WVmZjh8/rpqaGoVCIRUUFKilpSX+JsDOzk6lpn77gsKTTz6pvr4+/frXvx5wP7W1tXrwwQfPbfcAAMAxx5/zHw98zh8AYKtx/5w/AACY+Ig/AACWIf4AAFiG+AMAYBniDwCAZYg/AACWIf4AAFiG+AMAYBniDwCAZYg/AACWIf4AAFiG+AMAYBniDwCAZYg/AACWIf4AAFiG+AMAYBniDwCAZYg/AACWIf4AAFiG+AMAYBniDwCAZYg/AACWIf4AAFiG+AMAYBniDwCAZYg/AACWIf4AAFiG+AMAYBniDwCAZYg/AACWIf4AAFiG+AMAYBniDwCAZYg/AACWIf4AAFhmVPFvaGhQfn6+0tPT5fP5tG/fvrPOf+mllzRnzhylp6dr3rx5am5uHtVmAQDAuXMc/507dyoQCKi2tlb79+/X/PnzVVJSomPHjg05/7333tPy5ct166236sCBA1q2bJmWLVumDz/88Jw3DwAAnEsxxhgnC3w+n6655hpt3bpVkhSLxeT1enXPPfdozZo1g+aXlZWpp6dHr7/+enzs5z//uQoKCtTY2Diia0ajUWVmZioSiSgjI8PJdgEAmNAS0cBJTib39fWpra1N1dXV8bHU1FT5/X61trYOuaa1tVWBQGDAWElJiV599dVhr9Pb26ve3t74vyORiKT/HQAAADb5pn0On6uflaP4d3d3q7+/Xx6PZ8C4x+PRoUOHhlwTCoWGnB8KhYa9Tl1dnTZs2DBo3Ov1OtkuAADnjX//+9/KzMwck/tyFP9kqa6uHvBqwYkTJ3TJJZeos7NzzB44BotGo/J6verq6uLHKwnCGScH55wcnHNyRCIRXXzxxbrooovG7D4dxT8rK0tpaWkKh8MDxsPhsHJycoZck5OT42i+JLndbrnd7kHjmZmZfIElQUZGBuecYJxxcnDOycE5J0dq6th9Ot/RPblcLhUWFioYDMbHYrGYgsGgiouLh1xTXFw8YL4k7dmzZ9j5AAAgsRy/7B8IBFRRUaGioiItXLhQ9fX16unpUWVlpSSpvLxceXl5qqurkyTde++9uu666/T4449r6dKlampq0vvvv6+nnnpqbB8JAAAYEcfxLysr0/Hjx1VTU6NQKKSCggK1tLTE39TX2dk54KWJRYsW6YUXXtC6dev0wAMP6Gc/+5leffVVzZ07d8TXdLvdqq2tHfJHARg7nHPiccbJwTknB+ecHIk4Z8ef8wcAABMbv9sfAADLEH8AACxD/AEAsAzxBwDAMsQfAADL/GDi39DQoPz8fKWnp8vn82nfvn1nnf/SSy9pzpw5Sk9P17x589Tc3JyknU5cTs54+/btWrJkiaZPn67p06fL7/d/7/8n+B+nX8vfaGpqUkpKipYtW5bYDZ4nnJ7ziRMnVFVVpdzcXLndbs2ePZv/boyA03Our6/XZZddpilTpsjr9WrVqlX6+uuvk7Tbieftt99WaWmpZsyYoZSUlLP+0btv7N27V1dffbXcbrcuvfRS7dixw/mFzQ9AU1OTcblc5tlnnzX//Oc/ze23326mTZtmwuHwkPPfffddk5aWZh599FHz0UcfmXXr1pnJkyebDz74IMk7nzicnvGKFStMQ0ODOXDggDl48KD57W9/azIzM82//vWvJO98YnF6zt84evSoycvLM0uWLDG/+tWvkrPZCczpOff29pqioiJz4403mnfeecccPXrU7N2717S3tyd55xOL03N+/vnnjdvtNs8//7w5evSoeeONN0xubq5ZtWpVknc+cTQ3N5u1a9eaV155xUgyu3btOuv8jo4Oc8EFF5hAIGA++ugj88QTT5i0tDTT0tLi6Lo/iPgvXLjQVFVVxf/d399vZsyYYerq6oacf/PNN5ulS5cOGPP5fOZ3v/tdQvc5kTk94+86c+aMmTp1qnnuuecStcXzwmjO+cyZM2bRokXm6aefNhUVFcR/BJye85NPPmlmzpxp+vr6krXF84LTc66qqjK/+MUvBowFAgGzePHihO7zfDGS+N9///3myiuvHDBWVlZmSkpKHF1r3F/27+vrU1tbm/x+f3wsNTVVfr9fra2tQ65pbW0dMF+SSkpKhp1vu9Gc8XedOnVKp0+fHtO/KnW+Ge05P/TQQ8rOztatt96ajG1OeKM559dee03FxcWqqqqSx+PR3LlztWnTJvX39ydr2xPOaM550aJFamtri/9ooKOjQ83NzbrxxhuTsmcbjFX/xv1P+nZ3d6u/vz/+64G/4fF4dOjQoSHXhEKhIeeHQqGE7XMiG80Zf9fq1as1Y8aMQV90+NZozvmdd97RM888o/b29iTs8PwwmnPu6OjQ3//+d91yyy1qbm7WkSNHdPfdd+v06dOqra1NxrYnnNGc84oVK9Td3a1rr71WxhidOXNGd955px544IFkbNkKw/UvGo3qq6++0pQpU0Z0P+P+zB8/fJs3b1ZTU5N27dql9PT08d7OeePkyZNauXKltm/frqysrPHeznktFospOztbTz31lAoLC1VWVqa1a9eqsbFxvLd2Xtm7d682bdqkbdu2af/+/XrllVe0e/dubdy4cby3hu8Y92f+WVlZSktLUzgcHjAeDoeVk5Mz5JqcnBxH8203mjP+xmOPPabNmzfrzTff1FVXXZXIbU54Ts/5k08+0aeffqrS0tL4WCwWkyRNmjRJhw8f1qxZsxK76QloNF/Pubm5mjx5stLS0uJjl19+uUKhkPr6+uRyuRK654loNOe8fv16rVy5Urfddpskad68eerp6dEdd9yhtWvXjunfo7fVcP3LyMgY8bN+6QfwzN/lcqmwsFDBYDA+FovFFAwGVVxcPOSa4uLiAfMlac+ePcPOt91ozliSHn30UW3cuFEtLS0qKipKxlYnNKfnPGfOHH3wwQdqb2+P32666SZdf/31am9vl9frTeb2J4zRfD0vXrxYR44ciX9zJUkff/yxcnNzCf8wRnPOp06dGhT4b77hMvwNuTExZv1z9l7ExGhqajJut9vs2LHDfPTRR+aOO+4w06ZNM6FQyBhjzMqVK82aNWvi8999910zadIk89hjj5mDBw+a2tpaPur3PZye8ebNm43L5TIvv/yy+eKLL+K3kydPjtdDmBCcnvN38W7/kXF6zp2dnWbq1Knm97//vTl8+LB5/fXXTXZ2tnn44YfH6yFMCE7Puba21kydOtX89a9/NR0dHeZvf/ubmTVrlrn55pvH6yH84J08edIcOHDAHDhwwEgyW7ZsMQcOHDCfffaZMcaYNWvWmJUrV8bnf/NRvz/+8Y/m4MGDpqGhYeJ+1M8YY5544glz8cUXG5fLZRYuXGj+8Y9/xP+36667zlRUVAyY/+KLL5rZs2cbl8tlrrzySrN79+4k73jicXLGl1xyiZE06FZbW5v8jU8wTr+W/z/iP3JOz/m9994zPp/PuN1uM3PmTPPII4+YM2fOJHnXE4+Tcz59+rR58MEHzaxZs0x6errxer3m7rvvNv/5z3+Sv/EJ4q233hryv7XfnGtFRYW57rrrBq0pKCgwLpfLzJw50/zlL39xfN0UY3gtBgAAm4z7z/wBAEByEX8AACxD/AEAsAzxBwDAMsQfAADLEH8AACxD/AEAsAzxBwDAMsQfAADLEH8AACxD/AEAsMz/AcmNxq2e+191AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 坐标轴 `Axes`\n", - "坐标轴(`Axes`)是附加到图形(`Figure`)的一个图元(`Artist`)。每个 `Axes` 是具体绘制数据的区域,通常包括两个坐标轴对象(`Axis`),在 3D 情况下为三个坐标轴对象。每个坐标轴对象都有刻度线和刻度标签,用于为坐标轴上的数据提供刻度标尺。每个 Axes 还可以具有标题(通过 `set_title()` 方法设置)、x 轴标签(通过 `set_xlabel()` 方法设置)和 y 轴标签(通过 `set_ylabel()` 方法设置)。\n", - "\n", - "Axes 类提供了很多成员方法,用来对这个 Axes 进行细粒度的刻画。Axes 类基于面向对象编程(OOP)思想。例如,上面提到的 `ax.plot()` 使用 `plot()` 方法绘制线图。\n", - "\n", - "```{note}\n", - "注意不要混淆 `Axes` 和 `Axis`。 `Axes`(复数形式)通常指的是一个子图,严谨地说,`Axes` 是一个绘图区域或数据可视化的区域,可以在这个区域创建和展示数据图表。一个 `Axes` 对象通常包括 x 轴和 y 轴,用于绘制和展示数据。`Axis`(单数形式)通常指的是坐标轴,例如 x 轴或 y 轴,它用于设置刻度、刻度标签和控制坐标轴的属性。Matplotlib 中的 `Axis` 对象负责管理坐标轴上的刻度和刻度标签。\n", - "```\n", - "\n", - "### `Axis` 对象设置\n", - "\n", - "`ax.set()` 方法接受一个包含关键字参数的字典,每个关键字对应一个坐标轴属性,用来精细化地设置 `Axis` 对象。具体来说,`xlim` 和 `ylim` 分别设置 x 轴和 y 轴的范围,`xticks` 和 `yticks` 分别设置 x 轴和 y 轴上的刻度位置。或者直接使用 `ax.set_xlim()`, `ax.set_ylim()`, `ax.set_xticks()`, `ax.set_yticks()` 等方法设置这些参数。一方面,这种设置可以帮助我们调整图形的外观,更符合需求;另一方面,也可以规避一些错误。\n", - "\n", - "例如,\n", - "\n", - "(1)设置 x 轴的范围是 0 到 4,刻度是 1 到 3;y 轴的范围是 0 到 3,刻度是 1 到 2。\n", - "\n", - "(2)设置 x 轴的范围是 0 到 4,刻度是 1 到 3;y 轴的范围是 0 到 11,刻度是 1 到 2。\n", - "\n", - "可以发现,当改变 y 轴范围时,同样的波动在视觉上会变小,有时候会影响判断。" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, (ax1,ax2) = plt.subplots(1,2,figsize=(5, 2.7), layout='constrained')\n", - "\n", - "ax1.set(xlim=(0, 5), xticks=np.arange(1, 4),\n", - " ylim=(0, 4), yticks=np.arange(1, 3))\n", - "ax1.plot([1,2,3,4],[1.1, 2.1, 1.3, 2.4])\n", - "\n", - "ax2.set(xlim=(0, 5), xticks=np.arange(1, 4),\n", - " ylim=(0, 12), yticks=np.arange(1, 3))\n", - "ax2.plot([1,2,3,4],[1.1, 2.1, 1.3, 2.4])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_sources/ch-matplotlib/matplotlib-intro.ipynb b/docs/_sources/ch-matplotlib/matplotlib-intro.ipynb deleted file mode 100644 index ab3b260d..00000000 --- a/docs/_sources/ch-matplotlib/matplotlib-intro.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Matplotlib 简介\n", - "Matplotlib 是一个用于绘制二维图形的 Python 库,它是一个非常流行的数据可视化工具,特别适用于绘制各种类型的二维图像。通常和 pandas 与 NumPy 库一起使用。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 安装库和导入包\n", - "使用 `pip` 安装:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple\n", - "Requirement already satisfied: matplotlib in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (3.8.1)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from matplotlib) (1.1.1)\n", - "Requirement already satisfied: cycler>=0.10 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from matplotlib) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from matplotlib) (4.43.1)\n", - "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from matplotlib) (1.4.5)\n", - "Requirement already satisfied: numpy<2,>=1.21 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from matplotlib) (1.26.1)\n", - "Requirement already satisfied: packaging>=20.0 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from matplotlib) (23.2)\n", - "Requirement already satisfied: pillow>=8 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from matplotlib) (10.1.0)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from matplotlib) (3.1.1)\n", - "Requirement already satisfied: python-dateutil>=2.7 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from matplotlib) (2.8.2)\n", - "Requirement already satisfied: six>=1.5 in /Users/luweizheng/anaconda3/envs/pyds/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n" - ] - } - ], - "source": [ - "## 安装包\n", - "!pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "如下所示,导入 Matplotlib(并导入其他相关库):" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import matplotlib as mpl\n", - "import numpy as np\n", - "import pandas as pd" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 快速入门案例\n", - "\n", - "我们先从一个简单的例子开始,使用 Matplotlib 画出 (1,1),(2,4),(3,2),(4,3) 四个点构成的线图。透过这个例子,我们可以了解到 Matplotlib 的使用方式。\n", - "\n", - "第一步: 用 `plt.subplots()` 创建一个图形(Figure)和一个坐标轴(Axes),这个函数会返回一个包括两个元素的元组对象,我们一般分别命名为 `fig` 和 `ax`。\n", - "\n", - "- `fig`: 通常用于表示 Figure。我们可以将 Figure 理解为一张空白画布。Figure 是 Matplotlib 的最高级容器,可以在其中绘制一个或多个 Axes。\n", - "\n", - "- `ax`: 用于表示 Axes。我们可以将 Axes 理解为子图,Axes 实际上是绘图区域,可以在 Axes 上绘制数据点、线条、图形等。一个 Figure 可以包含一个或多个 Axes。\n", - "\n", - "第二步: 在坐标轴 `ax` 上使用 `plot()` 方法画图。传入两个列表,分别作为 x 坐标 和 y 坐标。" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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zp2L9evXY8eOHYiIiLjtNs56bDVlX93IaDQiLS3NKY6tG5lMJhgMhpt+z1mPqYbcal/dyJmOqbvuugtpaWlISUmpXwYMGICpU6ciJSXlN0UEEHRstdqlsTagtLRUPnr0qHz06FEZgPzvf/9bPnr0qJyZmSnLsiy//PLL8uOPP16//oULF2QPDw/5xRdflE+ePCl/9NFHslKplH/88UdRv4LVWLqv3n33XXnDhg3y2bNn5bS0NHnevHmyQqGQt2/fLupXsJpnnnlG1mq18s6dO+W8vLz6paKion6dxx9/XH755Zfrv967d6+sUqnkd955Rz558qT86quvyi4uLnJaWpqIX8FqmrKv/v73v8tbt26Vz58/Lx8+fFh+5JFHZDc3N/n48eMifgWrefnll+Vdu3bJFy9elI8dOya//PLLsiRJ8k8//STLMo+pX7N0XznrMdWQG++msYVjy6HLyLXbT29cpk+fLsuyLE+fPl0eNmzYb7bp06eP7OrqKnfs2FFevny51XOLYOm+evPNN+VOnTrJbm5uctu2beXhw4fLO3bsEBPeym62nwBcd6wMGzasft9d880338hdunSRXV1d5Z49e8o//PCDdYML0JR9NX/+fDk0NFR2dXWV/f395bFjx8pHjhyxfngre/LJJ+WwsDDZ1dVVbt++vXzXXXfVf7jKMo+pX7N0XznrMdWQG8uILRxbkizLcuuddyEiIiK6NV4zQkREREKxjBAREZFQLCNEREQkFMsIERERCcUyQkREREKxjBAREZFQLCNEREQkFMsIERERCcUyQkREREKxjBAREZFQLCNEREQkFMsIERERCfX/z86otQKozQIAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# 创建一个包含单个坐标轴的图形\n", - "fig, ax = plt.subplots()\n", - "\n", - "# 在坐标轴上绘制一些数据\n", - "ax.plot([1, 2, 3, 4], [1, 4, 2, 3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "这个例子画了 4 个数据点,数据点之间用线连接起来,`plot()` 传入了两个数组,第一个数组为数据点的 x 坐标,第二个数组为数据点的 y 坐标。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 基本概念\n", - "\n", - "如 {numref}`matplotlib-anatomy` 所示,Matplotlib 主要有以下概念:`Figure`、`Axes`、`Axis`。\n", - "\n", - "```{figure} ../img/ch-matplotlib/anatomy.webp\n", - "---\n", - "name: matplotlib-anatomy\n", - "---\n", - "Matplotlib 的重要组成部分\n", - "```\n", - "\n", - "* `Figure`:所有 Matplotlib 都是在 `Figure` 上画的。\n", - "* `Axes` 可以理解为 `Figure` 里的子图。\n", - "* `Axis` 是每个图的横纵坐标轴。\n", - "\n", - "后面将分别介绍不同的组成部分。" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_sources/ch-matplotlib/matplotlib-other-parameters.ipynb b/docs/_sources/ch-matplotlib/matplotlib-other-parameters.ipynb deleted file mode 100644 index 3766c25b..00000000 --- a/docs/_sources/ch-matplotlib/matplotlib-other-parameters.ipynb +++ /dev/null @@ -1,296 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# matplotlib 其他画图参数" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "为了画图更美观、更满足我们需求,还有很多参数可以设置,包括线条式样、颜色、图例等。\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 线条式样\n", - "\n", - "可以用 `linewidth` 设置线宽,`linestyle` 设置线形,常用线形有:\n", - "- `-`:一个减号,实线\n", - "- `–-`:两个减号,虚线\n", - "- `-.`:点划线\n", - "- `:`:点线\n", - "\n", - "\n", - "例如:生成两组随机数,对这两组随机数,我们在同一个坐标轴上画出两条线图,x=0,1,...99 序数,y 为对应数据的累积值,颜色 `color` 参数分别为蓝色和橙色,线宽 `linewidth` 参数分别为 3 和 2,线形 `linestyle` 参数为虚线和点线。\n", - "\n", - "```{note}\n", - "`l, = ax.plot()` 用法是为了接收 `ax.plot()` 返回的对象,因为 `ax.plot()` 返回了多个对象。当绘制折线图时,`ax.plot()` 返回一个包含绘制的折线对象的列表。通过使用 `l, = ax.plot()`,将列表中的对象解包到变量 l 中,后续则可以修改这些对象的属性,例如本处修改线条样式。\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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FUOHDiUqKgqTycT8+fMN2225DufPn2f06NGEhoYSHh7OAw88QHp6uv3BKA8ze/ZsFRAQoL788ku1a9cuNW7cOBUeHq6SkpJcHVqVGjBggJo5c6bauXOn2rZtmxo8eLBq0qSJSk9PL9znkUceUdHR0SouLk5t2rRJXXXVVerqq692YdRVb8OGDapZs2aqY8eOatKkSYXt3nxtzp8/r5o2baruvfdetX79enX48GH1+++/q4MHDxbuM336dBUWFqbmz5+vtm/frm6++WYVExOjMjMzXRi5873++uuqbt26atGiRerIkSPqxx9/VLVq1VL//ve/C/fxlmvz66+/queee07NnTtXAWrevHmG7bZch4EDB6pOnTqpdevWqdWrV6uWLVuqUaNG2R2LxyWyK6+8Uk2YMKHwc35+voqKilKxsbEujMr1Tp8+rQC1cuVKpZRSycnJyt/fX/3444+F++zZs0cBau3ata4Ks0qlpaWpVq1aqaVLl6prr722MJF5+7V5+umnVe/evUvdbjabVWRkpHrrrbcK25KTk1VgYKD6/vvvqyJElxkyZIi6//77DW233HKLGj16tFLKe69N8URmy3XYvXu3AtTGjRsL9/ntt9+UyWRSJ0+etOv7PerWYk5ODps3b6Zfv36FbT4+PvTr14+1a9e6MDLXS0lJAaBOnToAbN68mdzcXMO1at26NU2aNPGaazVhwgSGDBliuAYg12bBggV069aN2267jQYNGtC5c2c+++yzwu1HjhwhMTHRcH3CwsLo0aOHx1+fq6++mri4OPbv3w/A9u3bWbNmDYMGDQK8+9oUZct1WLt2LeHh4XTr1q1wn379+uHj48P69evt+j63q35fGWfPniU/P5+IiAhDe0REBHv37nVRVK5nNpuZPHkyvXr1on379gAkJiYSEBBAeHi4Yd+IiAgSExNdEGXVmj17Nlu2bGHjxo1W27z92hw+fJiPP/6YKVOm8Oyzz7Jx40b+8Y9/EBAQwNixYwuvQUn/P/P06zNt2jRSU1Np3bo1vr6+5Ofn8/rrrzN69GgAr742RdlyHRITE2nQoIFhu5+fH3Xq1LH7WnlUIhMlmzBhAjt37mTNmjWuDsUtHD9+nEmTJrF06VKCgoJcHY7bMZvNdOvWjTfeeAOAzp07s3PnTj755BPGjh3r4uhc64cffmDWrFl89913tGvXjm3btjF58mSioqK8/tq4kkfdWqxXrx6+vr5Wo8uSkpKIjIx0UVSuNXHiRBYtWsTy5csN67xFRkaSk5NDcnKyYX9vuFabN2/m9OnTdOnSBT8/P/z8/Fi5ciUffPABfn5+REREeO21AWjYsCFt27Y1tLVp04b4+HiAwmvgjf8/mzp1KtOmTePOO++kQ4cO3H333Tz++OPExsYC3n1tirLlOkRGRnL69GnD9ry8PM6fP2/3tfKoRBYQEEDXrl2Ji4srbDObzcTFxdGzZ08XRlb1lFJMnDiRefPmsWzZMmJiYgzbu3btir+/v+Fa7du3j/j4eI+/Vn379uXvv/9m27Ztha9u3boxevTowvfeem0AevXqZTVVY//+/TRt2hSAmJgYIiMjDdcnNTWV9evXe/z1ycjIsFqp2NfXF7PZDHj3tSnKluvQs2dPkpOT2bx5c+E+y5Ytw2w206NHD/u+sFJDVdzQ7NmzVWBgoPrf//6ndu/erR566CEVHh6uEhMTXR1alRo/frwKCwtTK1asUKdOnSp8ZWRkFO7zyCOPqCZNmqhly5apTZs2qZ49e6qePXu6MGrXKTpqUSnvvjYbNmxQfn5+6vXXX1cHDhxQs2bNUjVq1FDffvtt4T7Tp09X4eHh6pdfflE7duxQw4YN88gh5sWNHTtWNWrUqHD4/dy5c1W9evXUU089VbiPt1ybtLQ0tXXrVrV161YFqHfffVdt3bpVHTt2TCll23UYOHCg6ty5s1q/fr1as2aNatWqlQy/L/Dhhx+qJk2aqICAAHXllVeqdevWuTqkKgeU+Jo5c2bhPpmZmerRRx9VtWvXVjVq1FAjRoxQp06dcl3QLlQ8kXn7tVm4cKFq3769CgwMVK1bt1affvqpYbvZbFbPP/+8ioiIUIGBgapv375q3759Loq26qSmpqpJkyapJk2aqKCgINW8eXP13HPPqezs7MJ9vOXaLF++vMTfMWPHjlVK2XYdzp07p0aNGqVq1aqlQkND1X333afS0tLsjkXWIxNCCFGtedQzMiGEEN5HEpkQQohqTRKZEEKIak0SmRBCiGpNEpkQQohqTRKZEEKIak0SmRBCiGpNEpkQQohqTRKZEEKIak0SmRBCiGpNEpkQQohq7f8BEx7aCuzZ7wYAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "data1, data2 = np.random.randn(2,100)\n", - "fig, ax = plt.subplots(figsize=(5, 2.7))\n", - "x = np.arange(len(data1))\n", - "ax.plot(x, np.cumsum(data1), color='blue', linewidth=3, linestyle='--')\n", - "l, = ax.plot(x, np.cumsum(data2), color='orange', linewidth=2)\n", - "l.set_linestyle(':')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 颜色\n", - "\n", - "除了上面的例子设置的线条颜色,颜色还有更精准的设置,有些图形元素可以接受多种颜色,例如散点图中,标记的边缘颜色可以不同于内部颜色。\n", - "\n", - "### 案例:颜色\n", - "\n", - "例:对随机生成的两组数据 data1 和 data2,分别作为 x 轴坐标和 y 轴坐标,画散点图,点内部渲染为蓝色,边缘为黑色。\n", - "\n", - "```{note}\n", - "在 Matplotlib 中,\"C0\" 和 \"k\" 是用于表示颜色的字符串。 \"C0\" 表示默认颜色循环中的第一个颜色。Matplotlib 通常使用颜色循环来为不同的数据系列分配不同的颜色,以便它们在图中更容易区分。在这里,\"C0\" 表示颜色循环中的第一个颜色,通常是蓝色。\"k\" 是使用单个字符来表示颜色,\"k\" 代表黑色,常见的还有 b -- 蓝色, c -- 青色,g -- 绿色,m -- 紫红色,r -- 红色,w -- 白色,y -- 黄色。更多的颜色可以自行搜索。\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbUAAAD7CAYAAADtjwp1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAAArYklEQVR4nO3df1BU990v8PdCXFwqkIALJLggoE/yTNIk8xgx2psMdHzyY+5tNSvaK8O9pk3Nj6pP1JRebZoxtubh9moSniaZ/GhTba8Xo8Ia7qTTzqQ+i9KqTWrGZ66Zkgb8AcEgC4RFDWFxOfcPsxt+7I+zu+fH95zzfs0wo7vAfjln93zO9/v9fD9fmyRJEoiIiEwgTe8GEBERKYVBjYiITINBjYiITINBjYiITINBjYiITINBjYiITINBjYiITOM6vRsQy/j4OC5cuICsrCzYbDa9m0NERDqRJAmXLl3CTTfdhLS06P0xoYPahQsX4HK59G4GEREJoru7G3PmzIn6vNBBLSsrC8C1PyI7O1vn1hARkV6Gh4fhcrnCcSEaoYNaaMgxOzubQY2IiOJORTFRhIiITINBjYiITEPo4UcitQSDQbS1teHTTz/FjTfeiHvuuQfp6el6N4uIUsSgRpbj8XiwcdNmdHedDz/mKi5Bw4svwO1269gyIkoVhx/JUjweD6qrqzFgL0Bh7S64Nh1EYe0uDNgLUF1dDY/Ho3cTiSgFNpE3CR0eHkZOTg78fj+zHyllwWAQpWXlGLAXYLb7J7DZvrqnk6Rx9Ht2IG+sD2c7OzgUSSQYufGAPTWyjLa2NnR3nUf23asmBTQAsNnSkH33SnSfP4e2tjadWkhEqWJQI8v49NNPAQAznCURn58xu2TS9xGR8TCokWXceOONAIAx3/mIz4/1n5/0fURkPAxqZBn33HMPXMUlGD5xAJI0Puk5SRrH8ImDcJXMxT333KNTC4koVUzpJ8tIT09Hw4svoLq6Gv2eHci+eyVmzC7BWP95DJ84iJHO99HQ1MQkkRi4vo9Ex6BGluJ2u9HU1HRtndreuvDjrpK5aGhq4jq1GLi+j4yAKf1kSexxJCa0vs9RvhDZd6/CDGcJxnznMXziAEY630cTbwhIZXLjAYMaEcXE9X0kAq5TIyJFcH0fGQmDGhHFxPV9ZCRMFCHLMvK8mpZtn7i+L6PolmnPc30fiYQ9NbIkj8eD0rJyVFVVoaamBlVVVSgtKzdEQWOt2871fWQkDGpkOUau1K9H20Pr+0Y630e/ZwdGe/6G8dHPMdrzN/R7dlxb3/fC84bp5ZK5qZr9WF9fD4/Hg/b2djgcDixZsgQ///nPcfPNN8v6eWY/ktKMnMmnd9sjrlMrmYuGF55nOj+pTojsxyNHjmDdunU4ceIE3n33XYyNjeG+++7DlStX1HxZoqiMnMmnd9vdbjfOnumE1+tFY2MjvF4vznZ2MKCRUFRNFPnDH/4w6f979uxBfn4+Tp48iXvvvVfNlyaKyMiZfCK0PT09HZWVlar9fqJUaTqn5vf7AQC5ubkRnx8dHcXw8PCkLyIlGblSv5HbTqQVzSqKjI+P49vf/jaGhobwpz/9KeL3PPvss9i+ffu0xzmnRkrRe14qXttipemL3HYitQkxpzbRunXrcPr0abz11ltRv2fr1q3w+/3hr+7ubq2aRxYhaiafnDR9UdtOJBJNemrr169HS0sLjh49itLSUtk/x+xHUmuRsUiZfIkWC47U9jnFJVj7yPcwf/58wy0kJ5JDiILGkiRhw4YNOHToEFpbWzF//vyEfp5BzdrU3upEhIoiyQ4pTmz7xx9/jF+++Wt8wi1hyMSECGo/+MEP0NjYiJaWlklr03JycuBwOOL+PIOadVllq5PW1lZUVVWhsHZXxBJUoz1/Q+/eOni93ohZh3KO07Jly3QP3kSpEiKo2Wy2iI/v3r0bDz/8cNyfZ1CzJislROzbtw81NTVwbTqINPv0G73x0c/R3bAKjY2NWL169aTn5Bwnh/8sHI5M9uLI8IRIFJEkKeKXnIBG1qX3ImMtpZKmH+842W+6BQM+HwYNWA6MKFms/UjCEWGRsVZSKRYc6zhJ40FcOvV7OMoXYrb7J8gougVpdgcyim7BbPdP4ChfiI2bn0IwGFTnDyPSCYMaCcdKi4xTSdOPdZxGP/kQwWEfchZ/x/S9XaKJGNRIOFbb6sTtdqOpqQl5gYvo3VuH7oZV6N1bh7yxvpgJMbGO09VLAwCs0dslmohBjYRjxUXGyRQLjnWcLn/wOwDW6O0STaRZmaxkMPtRDHqt5xJpgbTIoi3GHhkZwUjO3OgZpIE+nD1j/AxSsgYhUvpTxaCmP7UXQMcjwgJpI4h0nFpaWiasYVuJGbNLMNZ/Hv7j19aw5c124o3XX+MNAhkCgxqlzCoLoM3M4/Hg0cefwICvL/xYenY+su58EIELf+N5JMNgUKNpEun1WGkBtFHJOZ/BYBBzS8vgC2Zi1j/9Z1yXlYeMObfClpbO80iGIsTiaxKHnCrwE1lpAbQRyT2fbW1t+KS7Czd88/uYdWsVZhbfDlvateCl9XkMBoNobW3Fvn370NrayjVypAoGNQsIDSMOJFBZwkoLoI0mkfMpynlM9KaKKFkMaiYXDAaxcdPmhCtLWGkBtJEkej5FOI/J3FQRJYtBzeSSHUa02gJoo0j0fOp9HpO9qSJKFoOaySU7/GTFBdBGkOj51Ps8cm6WtHad3g0gdU0cfoq0X1es4adQ+aaNmzaje29d+HFXyVw0aJAGzjVq0yVzPvU8j6LM6ZF1MKXf5JRIzdcjuOi96FtUqZxPPc5jqpugEoVwnRqFTV5E/VVlieETB4VcfMtF37EZ6XxyvSMphUGNJjFKHUVeBOUxyvkEjBWESVwMajSNEeaoOFwlnxHOZ4iRgjCJSW48YKKIhaSnpwsfCJhYIJ8RzmeI2+3GsmXLDBOEybgY1EgoqWRriiRUEqq1tRUAUFlZicrKSktfxI0UhMm4OPxIQjHDnFqkyviwpSEvL88yW70YaWiUjIHDj2RIocXC1dXV6PfsiJhY0NDUJPsCqfTFNd7v83g8WFFdDUfZXSi8/0fhzE3/8QMY6HwPK1asQHNzs6kDG5djkJ7YUyMhKZFYEG1H6LWPfA/z589POMjFu1gHg0HMLSvHwIx8OFc8M62X6WvegS+6/x+KCvNx7kynKXsuei3HYM/Q/Jj9SIaXyoUq2sXVf3w/RjrfD3+f3B6EnIt1bm6urMxNAKbM3tRr6Jg9Q2vgfmpkeKHEgtWrVyeUZBGriK5zxTNwlFcgPTsfBTX/S1aleLlFeXt6egDEz9wEzJm9qUedR+4AQFMxqJHpxLu45ixeieBwHyBdlVUpXu7F2ufzAYi/zQsgfvZmMrRejsEdACgSBjUyHbkX1+Dlz2T1IOT+PqfTiTnFJfAf3x9xmxf/8YOw2R2Y4yox5ZY9Wu/dxh0AKBIGNTIduRfX9Fk3AIjfg5D7+4qKivBvL76AkTN/ha/5Z5O2efE178BI53uQAiMYGfkcLS0tSf514tJ67zYu1KdIGNTIdOJdXP0nDuK6nAJkzLkVQPweRCIXa7fbjeamJmQOn0fv3jp0N6xC7946jJw5iTRHNq6/dw1Gri815XyP1nu3ibCrN4mH2Y9kStGK6PqPX1vr5ly+FZk3L5GdlZdoUd5AIICiOS4MjV2HzFv+E2aW3I6ZxV+HLS1dsUxAUdPYtarzaIaF+iQfU/rJ8FK9aEe6uNrsDuTcvRJZ//RfEq4Un8jFWu3CzKKnsWsVcLkDgHUwqJGhKXXRnnhx/fjjj/HLX72JT7q7vvqdCfYg5F6s9+3bh5qaGrg2HUSa3THt+fHRz9HdsAqNjY1YvXq17L8H4H5zU3EHAGsQIqgdPXoUO3fuxMmTJ/Hpp5/i0KFDWL58ueyfZ1CzJjUv2lr1INTqqYk+5KbXkKioQ7GkHCGC2u9//3v8+c9/xoIFC+B2uxnUKC7RL9pyqfV3iLzfXDK9awYjkkuIiiIPPvggduzYgYceekjW94+OjmJ4eHjSF1mLWdYeqZUJKGoaezKVPTweD0rLylFVVYWamhpUVVWhtKzcdFmhpC2hUvrr6+uRk5MT/nK5XHo3iTQm6kU7GW63G01NTcgLXJyU3p831pf0EKoIaeyhveL27duH1tZWBAKBhCt7sLwVqUWzRBGbzRZ3+HF0dBSjo6Ph/w8PD8PlcnH40UJEHl5LlpJDbHoPz0YaYnQWFMJ3sVf2OdP7byBjEmL4MVEZGRnIzs6e9EXWonVVCi0kW5g52u/ScoHzRNF6V1eyigEAY0O9EX9uau/aLEPMJCbTbxLKiWhjUXqTUDXo/Z4KDWtu3LQZ3V9uZQN8mcau4n5lE4cYQ8EoNMToa/4Zhlp342v/eA9saZOPxdQhUTMNMZN4TB3URF+gSpHpcdGWS5T3lNvtxrJlyzQLrqHeVWHthig7H1ybL/yi+zQcJXeEn4vUu544LxhpuJLlrSgVqga1y5cvo6OjI/z/s2fP4tSpU8jNzUVxcbGaLz1prVNh7YbwWqeBEwdQXV1tuQWq8ejd+5hK64u2HKK9p0LDmlqQ27sa8v4aaf/8eMzedWiIeeDEgYhzakYcYiZxqJooEpr0n2rNmjXYs2dP3J9Pdp0aJ6ITI0rvQ2Sivae0vgmRm8DjzC+Ar+9i+PFolT1EL28l2k0eCbL4OlXJBjUzZtCphSWX5BHpPaXHTYjcoN7x949w7NgxWcFA1PJWHo8HT27cNKmc2hxXMf6t4UV+FnQkNx6Yck6NE9HyxJv87/fswMbNT2HZsmWWv0sN7X+mxHsqlV6AXkOgchN47Ha77KAu6hDzihUrYJsxc9LjPb19WLFiBZqbmxnYBCdUSr9SRFigagRMrZbH4/GgoaEBQOrvqVSqaEy9CZGzyFlJaiwmV3K5Q6qCwSAefexxAMDM4tsnLVuYWXw7AODRxx9X7fiSMkwZ1My41kkN7NHGNzGQpOfkw5/CeyrVKhoi3IS43W6cPdMJr9eLxsZGeL1enO3sMEXvpbW1FQMDA3CUV8C5YvJNg3PFT+Aor8BA/yBaW1v1bqphTK0+o8UNgSmDmp4LVI2EPdr4QoEkZ/F3kFv1fYx0vA/flPeUr/lncd9TSvSyRLkJEal3paTW1lZAGkfO4sg3DTmLVwJSkEFNJr1qe5oyqAHqDJWYDXu08U0MJJk3L4Fz+VYEfOcnvadGznyAJ598Em63O+qdqRK9LN6EaCPeTQPFp2dtT9MGNcDcQyVKYI82vqmBJPPmJSh69A0UrP5XzP5WHW5Y+jggBbFs2bKYd6ZK9LJ4E6KuUIJLvJsGq2dMx6P33K+pgxpg3qESpbBHG1ukQGJLS8fM4tuR+Y/3YPTcB3CVzEV/f3/MO9OPP/4YQGq9LN6EqKuyshJ5znz4j++PeNPgP34As535DGpx6D33a8p1apQ4LjaNLt5C4f379+OpH9bFXsMV6IMkjWMwozDlxduiru8yA4/HgxXV1XCU3YWcxavC59p//ABGzvwVzbzRi2vfvn2oqamBa9NBpNkd054fH/0c3Q2r0NjYiNWrV8v+vZZep0aJ07LkktHEq0WZm5sbsy5i9t0r0b23Dtu3b8ezzz6bcqFmEdd3mYXb7UZzUxOe3LQZn0w818X61x01Cr1re7KnRiRTtN5sInemGRkZ7GUZAEcukqdWSTn21IgUFq03m8idaWVlpS69rFgXaV7Ap+PIRfL03j6KPTUyDb0uzqIVO54qVq1IAJYpZs3grS2l534tXdCYrEfvnQZErTofq2D1553vA5KEzHkVpi9mrff7Q2lGCdBKtpNBjSxDlJ0GRMtKjNeD9DX/DF90n8acf2lEWvqMSc/p3btUkijvD6WYLUDLxaBGliDa0J9Id9Byt8spWP2v4YK9U58z+vZMor0/UmW2AJ0IufHA9IuvydxSWeipRrFVkRb7y61iErz8WdTnjF7MWu+FwErSu1KHUTCokaElW35Kr2KrWpJbKzJ91g1RnzN6HUlRikArwUwBWk0MamRoyRT5TaTYqh5bZyglXq1I//EDsM3IwIwb/2Hac2apI2mmItBmCtBqYlAjQ0u0yG8iQzhG783FqhUZ2i5HGhtFz0u18B8/YMo6kmYqAm2mAK0mJoqQ4SWSTi83eSJU0soME/KRsuXSZ+Xh+srvYsb1hfAf34+RzvfDz5mtwomoyy0SZbakl0Qx+5EsRW46vdySVrl5s/HFDWWmuXgEAgHMcRXDb5uF66u+h5mu22BLu9b20N/k8J/D/n2Nuie4qEG05RbJMkuATgbLZJGlyC3yK7ek1eBAPwof3BKzQHFbW5th0t2PHTsGX99FFNbWTfu7Q39T7946pKenmy6gAeYpAh2vuLZZA1oiGNTINOTU6wvNsQycOBCxFzZ84iDynPkY8PWZakLeqEkGSq77M0s9R7MEaLUwUYQsRc5Gm/+yfh0Ac03IGzHJwIiJOlply4q0HlI0nFMjS4o0x5JfcCNeefkXeOihh0w3IS9ykkGk3lhLS4vhKmdYtXyVVpgoQhTHwYMHsW79Bvj6LoYfm1i93mwT8lolGSQyZBgpEMxxFWPkiy8wkjM3bgAGIMQwnJXLV2mFQY2Ep2edRDkXISDCtiwGzJibKF4WYKrnJJHeSrRz8Nm//wqjF9plLbv41Zu/1r1nJFIvWKTao0pjUCOh6TlUk8hFCBCjJ6CkaBe+VM9JIr2VWOfg8odeDLzzfNxlFwCE2DZH7tpHtYtDm334kwWNSViJlKlKlJyJ+kRq6JlxQj7S35TqOUm02G6sc3BdVh6A+EktGTfdIkRhXxEyS9X8TBkNgxppSs1K43Kz5dS6CIlSJzLRdihxThItthvrHGTMuRXp2U74j++PWtoKtnRcX/k9IQr76p1Zyur9kzGokabUqjSeyJ2qGhchUdLPk2lHMudkauDs6ekBIP9GIdY5sKWlI+vOB6Muu7i2Y3cQ9oJSWa+lNr3rS7J6/2SaBLVXXnkFc+fOxcyZM7Fo0SK89957WrwsCUiNXlKid6pKX4REGfpJth2JnpNIgXPT5qcAyL9RiHcOAhfaked0IjdwEb1769DdsAq9e+uQN9aH7c8+m9BrqU3O2kc1i0OLMPwpEtWD2v79+7F582Zs27YNH3zwAe644w7cf//96OvrU/ulSUBq9JISvVNV8iIkytBPKu1I5JxEC5yXs4qBtHTZNwpyzsEbr72Gc2c64fV60djYCK/Xi7OdHXj66aeFq7wfKl+VFyEIq520ovfwp2hUz35ctGgRFi5ciJdffhkAMD4+DpfLhQ0bNmDLli0xf5bZj+ajRvqz3CLFjY2NWL16dfhxJYrcipL5lko75J6Tjr9/hHnz/yHq9/X+djMCvR1fZiTKWweX7DkQtbCvHin1Ii0pUJMQBY0DgQBOnjyJrVu3hh9LS0vD0qVLcfz48WnfPzo6itHR0fD/h4eH1Wwe6SB0h15dXY1+z46IF6SGpqaEPnxyixRPvVNVooaeKEM/qbRD7jk5duwYurvOo7B2Q8Qece7Sx9C7tw5fu9SFXpnFdpM9B9EK++YX3IhHn3wSubm5CAaDml/E9agvqcZnyshUDWr9/f0IBoMoKCiY9HhBQQHa29unfX99fT22b9+uZpNIAEpXGpdTpDjacFSqF6FkA6rSUm2HnHOyb98+APED54vP70JRUZHsIJXsOZgYEFtaWvB/Gveh7+KnaGhoQENDg6nWaMXD6v1fUXX48cKFCygqKsKxY8ewePHi8OM/+tGPcOTIEfzlL3+Z9P2Remoul4vDjyal5FCNXsNRogz9KNWOWOdElKHWqVii6iusKKJyUAsEAsjMzERTUxOWL18efnzNmjUYGhpCS0tLzJ8XaU7NzG8Ws9BrI0hR5nfUbocoATyZNnX8/SMcO3aMn18Dkx0PJJVVVFRI69evD/8/GAxKRUVFUn19fdyf9fv9EgDJ7/er2cS4mpubJVdxiQQg/OUqLpGam5t1bRdNd/XqVcnr9UqNjY2S1+uVrl69qsnrRnyPlMzV/D2idjuam5slm80mZc6rkAprd0qujQekwtqdUua8Cslms2n+93q9XgmAVFi7Syr5H+9M+yqs3SkBkJwFhZb9/Or1mVCa3Higevbj/v37sWbNGrz++uuoqKhAQ0MDDhw4gPb29mlzbVOJ0FPj0AbJJUpvXu126NUjjiRe5muojqQINSL1YKZ6kEIMP4a8/PLL2LlzJ3p7e3HnnXfiF7/4BRYtWhT35/QOaiIOt5AxiBLg1CLK3xdrnk8aD6Ln1e/CXlAO54pnFP/8inIMojHbDblQQS1Zegc1USfGSWxmujtOllYX/Fg3niPn/wN9bz2tyudX9HNsxhtyVulXgChrkMg49C6ZJUJRZS3rYMaqTDLk/TUA5T+/ep9jOaxcD5JBLQaWn6FE6F0yS4Siynpc8KOVqMrBZQDKfn71PsdyWfmGnEEtBr2rb1uVCL2NZOh5dyxC70HPC77b7cbZKXUiP+nqUvzza5QekJVvyBnUYtC7+rYVidDbSJZed8ei9B70vuBP3fzUbrcr/vnV4hwrcVNn5RtyBrU49Ky+HY1RezLxiNDbSIVSd8eJnl+9g0mIiENeSn9+1e4BKXVTZ+UbcmY/yiRK+q7oWVfJMkO2VrS/QRoP4ovu0xjy/ho5uIxPurpgt9sj/o5kzm+yuxQoTeRsYaU+v2q+T9VIwRdpTWGqmNJvQmZbdzKRyBfEREwtVTU21Iuh1t0IXh4Mf0+0IJXs+RXl2JnhxkQONcqRqXnsRLkhTxWDmsmY/YIhSm9DCVPvjh3lC5Gz+Dsxg1Qq51ek90aiF/zQBbenpwc+nw9OpxNFRUXCX3iV7gGJcmMiMq5TMxlR5k3UYqRsrXhzXm63Gx0f/x3OgkJkzquAc8UzcZM3Ujm/ic6fqDknm8gc1sT5o9r/9t+xadMm1NbWGiI5KFK25dnOjqRHSkScjzQqVfdTI+WY/U2fyp5oWpI753Xs2DH4Lvai8J9/GD1I7a1DW1sbKisrUz6/cvfT0mJOVs7Gn6Ee3YyCcgA2OMruQs7ir4ZcB04cQHV1tdBD6kpuCCrKvnxmwJ6aQRipJ5MMI2RrJZKdmWiQUuL8xus9aJldOjW9fuJ5Cy1BmFl2F4Ijw3DMWwjnCnEXMmvByin4SuOcmkGING+iJlGztRI9/onOkSRzfhNJABDp/RM6NjcsfRyf/fE1w88jKZWIIcq+fKLinJrJGKEnowSl5yqUkuicV6J33ome30TXM4k0JxvqndpmZAAw9pC6ksUCRFwTa0ScUzMQufMmRqfkXIVSEh1ODAWp6upq9Ht2RLzzbmhqmnQTksi8WOiOvrB2Q9x5qGAwiMOHD0dtvzQeRHDkWp3Ew4cPq555GBpClcZGARh3HinR8yCHnPlIio3DjwZklnUnRpJsynUyw6mxzm+iw4hTX39q+z//6BgGvW8i6L/4VftUXswf+hv6Z+Qj0H8edudcOA02pC7ScK5VcJ0amYregTzVdWRKtT2R4Do4OBjuScy6y43+//s/kT4rDzd883uY6boNIx//Bb63679cR6ftYv6J2Y+B3s4v22CceSSuK9Oe3HjA4UcSngilwZIZTpz4s0pd2OQOg/b09GDrj5+Go3whMm/7JgZ+/yLGPx/C+OdD6HvraaR97QZAGoej/FrmYShIhzIP+z07sHHzU1i2bJkqNw+ThlohYeTMXzHS+V74edGH1M2+xMbIGNRIaGrMWyRLhDlNueuZfD4furvO4/p7K9H/9s/hmLcQOd+qCx+/wX//JQIXPkLO4hiJIxPW0alh4vyR0SqKcF2ZuDj8SMISdd5Cz6FQucek/rkdqK2tRXp2Puz50+esLn/oxcA7z5uiLJkeRH1vmhlT+ilhom1pI1Ia+kSxFhbHosTxlZv6X1RUdO01h/uQE+H4XZeVB8C8i/nVZpUlNkbE4UcCIMa81VRmmrdQ8vjKGQYNBoPIzc3D4OBAxOOXMedWpGc74T++H84VzwhblkxkIgxH03QMaiTUvNVEZpm30GM9U0tLC65+2ROMdPxsaenIuvNBDB39bcKJL/QVrisTD+fULE7kuQGR2yaXHn9DKIjOLLsLgYudsBfMm5ThOPG1Hf6zcDgy8YlgZcmIpuKcGski6rwVYI55C62Pb6hY8LVU/WeQu/RxjHS+D1+U4/fGa6/hnIBlyYiSxeFHixN93sro8xZaH99QEC2s3QCbLQ2ZNy+Bc/lWDHrfRO+E45dfcCP+94TjxwXCZBYMahZnhHkrI89baH18IwXRzJuXwDF/EUY/+RBjn/Vi8A+/wAvP7xT+hoAoGRx+tDij7OOUbBq93rQ+vtH2ZbOlpWNm8e2wz3YBQDjln8hsGNQszgzzVlpKdK2Z1sfXKDcpRKqRBOb3+yUAkt/v17spptfc3Cy5ikskAOEvV8lcqbm5We+mCSPiMSouiXqMrl69Knm9XqmxsVHavn27NEej49vc3CzZbDYpc16FVFi7U3JtPCAV1u6UMudVSDabjeeUDEluPGBKP4XpXQlfZJN3JZ5e0X7//v1wOp3hY9ff34/NT/1w0mLrOa5irP3+I5g/f77qx1eUHcT5niKlcOsZIoXEW2vW+9vNCA50ITgWmPRzmfMqIgZArRaz6x1QRKlSo/dxIGXoHtSee+45/O53v8OpU6dgt9sxNDSU8O9gUCMRHD58GEuXLo24d9bnHx37ck+yu5Cz+Du4Lm8OPn3zBzEXPIu+YFwJ8Xq2WgV2UQIrpU73xdeBQAArV67EE088odZLEKnO4/Fg1Xf+K4Dpa82k8SAGvW+GFzpnFN2Csb4zCF4ejL2li06L2bUycQH4bPdPkFF0C9LsjvBebY7yhdi4+SnVC2aHAuuAvQCFtbvg2nQQhbW7MGAvQHV1NTwej6qvT/pQLaht374dmzZtwte//nW1XoJIVaGL4pWM2QCmp8mPfvIhgv6LkwJY8PJnAMRdzK4FEarUiBJYSXtCpfSPjo5ieHh40hdRKpLd7mXiRTG/ph7pOQXwT0mTjxTA0mfdAMDaW7qIUKVGhMBK+hAqqNXX1yMnJyf85XK59G4SGZjH40FpWTmqqqpQU1ODqqoqlJaVyxp2mnhRTEufgdyqRzDSMbmGYnDkEoDJASxjzq0RAyBgnXVi0RaAh2gR2EUIrKSPhILali1bYLPZYn61t7cn3ZitW7fC7/eHv7q7u5P+XWRtqc6nTL0ohmooBnzn0bu3Dt0Nq/DZH19D2nUzJi10tqWlfxUAm39mycXsIiwAFyGwkj4Syn70+XwYGBiI+T1lZWWw2+3h/+/ZswcbN25k9iNpRontXlpbW1FVVTUt41EaD2L0kw/xRddp+P/ciG3btuGnP/3pl1l+X+1JNvjH1xHoOwuMfzXcaaUtXSZnP07fq03t7EczbFtEk8mNBwkVNHY6nXA6nSk3jkhNUyvVTxSeT9lbh7a2tqjV6UO9jYETByZdFG1p6chw3YZL778NV8lcPPPMM7j99tsj7iLw/Fv7Ji3IttL6KL13VwiVJ6uuruYmqBajWpX+rq4uDA4OoqurC8FgEKdOnQIAzJs3D7NmzVLrZYkUmU9J5KJo5F0E1KT3cdE7sJI+VFt8/fDDD+M3v/nNtMe9Xq/svZs4/EjJiDZ0GDLa8zf07q2T9V7Uq9wUq2Aoh8fSHHSvKKIEBjVKhtLzKVpfFFkFg2g6BjWyNL0TFZIlSnkpItEwqJHliVKpXi49MvY4NEdGoXvtRyK9ud1unD3TCa/Xi8bGRni9Xpzt7BAyoAHaV8FIZXE6kahUy34kEkF6errsxCS9aVkFY+IwZ2HthvAw58CJA6iurjb9MGekHioA9lpNgEGNSBATq2BEytpUqgrG1GK/oV5hqNhvv2cHNm5+CsuWLTPlRT3SsHTebCdgs2HA1xd+jMk5xsThRyJBaFVeysrFfiOVT7v+3jUY6Pfh8+wSblFjAgxqRIIILfge6Xwf/RMKJytdN9KqxX4jbUdju86OS//xBzjKK8J74nGLGmNjUCMSSKgKRl7gYrhwcu/eOuSN9Sk2z2XVYr+ReqiR9sQLMXuv1aw4p0aqYsp44tQuLxWtriVg7u1xIvVQualrckT+XDOokWq0rowh8gctUWpmbVq12G+kRJyJm7qqmZxjJqJXvOHia1KF1pUxRP+gichoi9NTFWlxuzQeRM8bj8I+uwTOFdyiJh49K96wogjpRuvKGCwtlTwz9W7liFQ+7dIH72Do6G/hKF+InMWrDFNSTWt671HHoEa6UbJKfjx6f9DIeCKuU3M6AUxZp2biXmsytPxcR6LKJqFEcmiZMq7EhqBkLdEScQBWFInFKEtBGNRIcVpVxgCM80EjsURLxOGNT3Rafq5TwXVqpDitKmMA1l1zRaQ1LT/XqWBQI8VpVRkDMM4HjcjotPxcp0QSmN/vlwBIfr9f76ZQEpqbmyVXcYkEIPzlKpkrNTc3K/46NptNypxXIRXW7pRcGw9IhbU7pcx5FZLNZlP89YisTKvP9VRy4wGzH0lVWqWMW23NFU1nteUJetLjWDOlnyyHFzXr4uJ782NQIyJL4OJ7a2BQIyLT4+J765AbD5j9SESGZeUNTykyBjUiMiwuvqepGNSIyLC4+J6mYlAjIsPi4nuaikGNiAzLMFUuSDMsaExEhuZ2u9HU1HRtndreuvDjrpK5aGA6v+UwpZ+ITIGL782N+6kRkaVE206GrIVzakREZBqqBbVz587hkUceQWlpKRwOB8rLy7Ft2zYEAgG1XpKIiCxOteHH9vZ2jI+P4/XXX8e8efNw+vRprF27FleuXMGuXbvUelkiIrIwTRNFdu7ciVdffRVnzpyR9f1MFCEiIkDQRBG/34/c3Nyoz4+OjmJ0dDT8/+HhYS2aRSpiRhoRaUmzRJGOjg689NJLeOyxx6J+T319PXJycsJfLpdLq+aRCjweD0rLylFVVYWamhpUVVWhtKwcHo9H76YRkUklHNS2bNkCm80W86u9vX3Sz/T09OCBBx7AypUrsXbt2qi/e+vWrfD7/eGv7u7uxP8iEkJoj6sBewEKa3fBtekgCmt3YcBegOrqagY2IlJFwnNqPp8PAwMDMb+nrKwMdrsdAHDhwgVUVlbi7rvvxp49e5CWJj+Ock7NmLjHFREpTbU5NafTCafTKet7e3p6UFVVhQULFmD37t0JBTQyrtAeV4W1G6LvcbW3Dm1tbVwsS0SKUi1RpKenB5WVlSgpKcGuXbvg8/nCzxUWFqr1siQA7nFFRHpRLai9++676OjoQEdHB+bMmTPpOYHLTZICJu5xlVF0y7TnuccVEamFBY1JcZxTIyKlyY0HnOQixXGPKyLSC6v0kyq4xxUR6YHDj6QqVhQhIiUIWSaLrId7XBGRljinRkREpiF0Ty00MsrCxkRE1haKA/FmzIQOapcuXQIAFjYmIiIA1+JCTk5O1OeFThQZHx/HhQsXkJWVBZvNpvnrDw8Pw+Vyobu7m4kqCeBxSw6PW3J43JJnpGMnSRIuXbqEm266KWbJRaF7amlpadOqkeghOztb+BMuIh635PC4JYfHLXlGOXaxemghTBQhIiLTYFAjIiLTYFCLISMjA9u2bUNGRobeTTEUHrfk8Lglh8cteWY8dkInihARESWCPTUiIjINBjUiIjINBjUiIjINBjUiIjINBjUiIjINBjUZzp07h0ceeQSlpaVwOBwoLy/Htm3bEAgE9G6a8J577jksWbIEmZmZuP766/VujtBeeeUVzJ07FzNnzsSiRYvw3nvv6d0k4R09ehTf+ta3cNNNN8Fms+Htt9/Wu0nCq6+vx8KFC5GVlYX8/HwsX74cH330kd7NUgyDmgzt7e0YHx/H66+/jg8//BAvvvgiXnvtNfz4xz/Wu2nCCwQCWLlyJZ544gm9myK0/fv3Y/Pmzdi2bRs++OAD3HHHHbj//vvR19end9OEduXKFdxxxx145ZVX9G6KYRw5cgTr1q3DiRMn8O6772JsbAz33Xcfrly5onfTFMF1aknauXMnXn31VZw5c0bvphjCnj17sHHjRgwNDendFCEtWrQICxcuxMsvvwzgWjFvl8uFDRs2YMuWLTq3zhhsNhsOHTqE5cuX690UQ/H5fMjPz8eRI0dw77336t2clLGnliS/34/c3Fy9m0EmEAgEcPLkSSxdujT8WFpaGpYuXYrjx4/r2DKyAr/fDwCmuZ4xqCWho6MDL730Eh577DG9m0Im0N/fj2AwiIKCgkmPFxQUoLe3V6dWkRWMj49j48aN+MY3voHbbrtN7+YowtJBbcuWLbDZbDG/2tvbJ/1MT08PHnjgAaxcuRJr167VqeX6Sua4EZF41q1bh9OnT+Ott97SuymKEXo/NbU99dRTePjhh2N+T1lZWfjfFy5cQFVVFZYsWYI33nhD5daJK9HjRrHNnj0b6enpuHjx4qTHL168iMLCQp1aRWa3fv16vPPOOzh69KgQ+1YqxdJBzel0wul0yvrenp4eVFVVYcGCBdi9e3fMnVfNLpHjRvHZ7XYsWLAAhw8fDic5jI+P4/Dhw1i/fr2+jSPTkSQJGzZswKFDh9Da2orS0lK9m6QoSwc1uXp6elBZWYmSkhLs2rULPp8v/BzvpGPr6urC4OAgurq6EAwGcerUKQDAvHnzMGvWLH0bJ5DNmzdjzZo1uOuuu1BRUYGGhgZcuXIF3/3ud/VumtAuX76Mjo6O8P/Pnj2LU6dOITc3F8XFxTq2TFzr1q1DY2MjWlpakJWVFZ63zcnJgcPh0Ll1CpAort27d0sAIn5RbGvWrIl43Lxer95NE85LL70kFRcXS3a7XaqoqJBOnDihd5OE5/V6I76/1qxZo3fThBXtWrZ79269m6YIrlMjIiLTsO7EEBERmQ6DGhERmQaDGhERmQaDGhERmQaDGhERmQaDGhERmQaDGhERmQaDGhERmQaDGhERmQaDGhERmQaDGhERmcb/B094kVGFxZY/AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(5, 2.7))\n", - "ax.scatter(data1, data2, facecolor='C0', edgecolor='k')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 标记点形状\n", - "\n", - "通常我们作图时,尤其是二元坐标图,是对 `(x,y)` 形式的点画图,点的样式可以用 `marker` 参数设置,常用标志点形状有:\n", - "- `o`:圆形\n", - "- `*`:星型\n", - "- `+`:+ 号标记\n", - "- `x`:x 号标记\n", - "\n", - "### 案例:标记\n", - "\n", - "例:将上例中的散点图修改为星型标记。" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(5, 2.7))\n", - "ax.scatter(data1, data2, facecolor='C0', edgecolor='k',marker='*')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 图例 `legend`\n", - "\n", - "`.legend()` 用来给图像增加图例,图例是对图像上各种符号和颜色所代表内容和指标的说明,以便于更好地理解图。\n", - "\n", - "当在坐标轴 `ax` 上画图时,传入不同的 `label` 参数,`legend` 函数则会对不同的 `label` 作出图例。\n", - "\n", - "### 案例:图例\n", - "\n", - "例:对四个随机数据集 data1,data2,data3,data4 画出点线图,默认每一组颜色不相同,用图例对颜色和数据对应作出说明。" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "data1, data2, data3, data4 = np.random.randn(4, 100) \n", - "fig, ax = plt.subplots(figsize=(5, 2.7))\n", - "ax.plot(data1, label='data1')\n", - "ax.plot(data2, label='data2')\n", - "ax.plot(data3, label='data3')\n", - "ax.plot(data4, label='data4')\n", - "ax.legend()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "由于是随机生成的点,因此该点线图是杂乱的波动。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 案例:设置图例位置\n", - "\n", - "画图时,我们经常需要调整图例位置:`legend()` 的参数 `loc` 可用于设置到不同的位置,常见参数设置有 “upper right”, \"upper left\", \"lower left\", \"lower right\", \"right\", \"center left\", \"best\" 等。" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(5, 2.7))\n", - "ax.plot(data1, label='data1')\n", - "ax.plot(data2, label='data2')\n", - "ax.plot(data3, label='data3')\n", - "ax.plot(data4, label='data4')\n", - "ax.legend(loc='upper right')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_sources/ch-matplotlib/matplotlib-plot-types.ipynb b/docs/_sources/ch-matplotlib/matplotlib-plot-types.ipynb deleted file mode 100644 index beeab1f7..00000000 --- a/docs/_sources/ch-matplotlib/matplotlib-plot-types.ipynb +++ /dev/null @@ -1,316 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 图形种类" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "除了前面例子中使用的 `plt.scatter()` 画散点图,`plt.plot()` 画点线图,Matplotlib 还有多种图形方法可供选择,这里介绍柱状图、茎叶图、饼图、直方图和箱线图,其他图形可以参考其官网网站。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## `.bar()` 柱状图\n", - "\n", - "柱状图是一种常见的统计图表,用于展示不同类别或组之间的数量关系。它通过在坐标轴上以柱状的形式表示数据,直观地展示了各类别之间的相对大小或变化趋势。\n", - "\n", - "在柱状图中,通常横轴表示不同的类别或组,纵轴表示数量或其他度量。每个类别或组都用一个垂直的柱子表示,其高度代表相应数据的数值。\n", - "\n", - "`.bar()` 方法绘制柱状图时有很多参数,除了必须指定横坐标和纵坐标之外,还可以用 `width` 参数指定每个柱子的宽度,`edgecolor` 参数和 `linewidth` 参数指定边缘线颜色、宽度,`facecolor` 参数指定内部的颜色等。可以通过下面的例子体会一下。\n", - "\n", - "例:A 类别对应的值为 4.8,B 类别对应的值为 5.5,C 类别对应的值为 3.5,D 类别对应的值为 4.6,画出各类别的柱状图。" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "x = ['A','B','C','D']\n", - "y = [4.8, 5.5, 3.5, 4.6]\n", - "\n", - "# plot\n", - "fig, ax = plt.subplots(2,1)\n", - "ax[0].bar(x, y)\n", - "ax[1].bar(x, y, width=0.5, facecolor='y',edgecolor=\"c\", linewidth=2)\n", - "\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## `.stem()` 茎叶图\n", - "\n", - "茎叶图强调每个数据点的具体值,并在该值处绘制垂直线。这种图形常用于显示数据的分布和变化趋势。\n", - "\n", - "与传统的柱状图(bar chart)相比,`stem` 图更注重显示每个数据点的具体值,而不是强调整体的分布。这使得 `stem` 图在特定情境下更具优势,尤其是当关注数据点的绝对值时。\n", - "\n", - "例:使用柱状图的数据画茎叶图,并依次调整\n", - "\n", - "(1)每个数据点处使用红色圆圈标记;\n", - "\n", - "(2)用绿色实线作为基线\n", - "\n", - "\n", - "(3)蓝色虚线连接垂直线。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'modify linefmt')" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfcAAAINCAYAAAAjlDbFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAABG70lEQVR4nO3de3xUhZn/8e8kIQPkMhguISEhoCAXKSgILsVIRBQQUhQvLAUJSLsVgUJZ/bnZqqBbG1dXRFde2RZB2qqgYhClEi9QIFu5CYZiuVRYogEGsRVyg0xIcn5/jBmIJJBJZubMnPm8X6/zYs6ZM3OeJ8Mzz5y7zTAMQwAAwDIizA4AAAD4Fs0dAACLobkDAGAxNHcAACyG5g4AgMXQ3AEAsBiaOwAAFkNzBwDAYmjuAABYDM3dojIyMjRv3jy/vHdRUZFsNpsKCwv98v5AOPl+rXbr1k2LFy/2jJ84cUK33nqrYmJi1K5du4DH1xz++v45c+aM7rrrLsXHx8tms+n06dM+X4ZVRJkdAEJPamqqnE6nOnToYHYogOXs3LlTMTExnvHnn39eTqdThYWFcjgcJkZmvt/97ncqKCjQJ598og4dOjT777FixQrNmzfP0j8OaO7wWmRkpDp37mx2GIAldezYsd744cOHNWjQIPXs2dOkiJquqqpK0dHRfnvfw4cPq0+fPurXr5/Pl2E1bJa3sOrqas2ePVsOh0MdOnTQY489prr7BP3hD3/Q9ddfr7i4OHXu3Fk//vGPdfLkSc9rT506pcmTJ6tjx45q06aNevbsqVdeeUXSxZvlLzUvEIoyMjI0Z84czZs3T1dccYUSExO1dOlSVVRUaPr06YqLi1OPHj20fv36eq/bvHmzhgwZIrvdrqSkJP3bv/2bqqurPc9XVFRo6tSpio2NVVJSkp577rmLln3hZvlu3brp7bff1u9//3vZbDZlZWWpR48e+q//+q96ryksLJTNZtOhQ4cazGfatGm644479Otf/1qJiYlq166dnnzySVVXV+vhhx9WQkKCUlJSLqrbRx55RFdffbXatm2rK6+8Uo899pjOnTvneX7hwoW69tpr9fLLL6t79+5q3bp1g8v/4x//KIfDoddee02SVFxcrHvvvVft2rVTQkKCxo8fr6Kioovifeqpp5ScnKxevXopIyNDzz33nLZs2SKbzaaMjAzP3+hXv/qV5++alpamd999V998843Gjx+v2NhY9e/fX59++qkkadOmTZo+fbpKSkpks9lks9m0cOHCBuMOZTR3C/vd736nqKgo7dixQy+88IIWLVqkl19+WZJ07tw5/cd//If27Nmjd955R0VFRZo2bZrntY899pj27dun9evXa//+/crNzW10M7w38wKh4ne/+506dOigHTt2aM6cOZo5c6buuece/fCHP9Tu3bt122236b777tOZM2ckSceOHdPtt9+uwYMHa8+ePcrNzdWyZcv0q1/9yvOeDz/8sDZv3qy1a9fqww8/1KZNm7R79+5GY9i5c6dGjx6te++9V06nUy+++KLuv//+i5rwK6+8optuukk9evRo9L02btyo48ePa8uWLVq0aJEWLFigcePG6YorrtD27dv1wAMP6Gc/+5mOHj3qeU1cXJxWrFihffv26YUXXtDSpUv1/PPP13vfQ4cO6e2331ZeXl6Dx+G8/vrrmjRpkl577TVNnjxZ586d06hRoxQXF6eCggL9+c9/VmxsrEaPHq2qqirP6zZs2KCDBw/qo48+0rp165SXl6ef/vSnGjp0qJxOp/Ly8jzzPv/88xo2bJg+++wzjR07Vvfdd5+mTp2qKVOmaPfu3brqqqs0depUGYahH/7wh1q8eLHi4+PldDrldDr10EMPNfp3C1kGLGn48OFGnz59jNraWs+0Rx55xOjTp0+D8+/cudOQZJSVlRmGYRiZmZnG9OnTG5z3yJEjhiTjs88+u+y8QCgaPny4ceONN3rGq6urjZiYGOO+++7zTHM6nYYkY+vWrYZhGMa///u/G7169apXc0uWLDFiY2ONmpoao6yszIiOjjbefPNNz/P/+Mc/jDZt2hhz5871TEtLSzOef/55z/j48eONrKwsz/ixY8eMyMhIY/v27YZhGEZVVZXRoUMHY8WKFY3mk5WVZaSlpRk1NTWeab169TLS09MvynHlypWNvs+zzz5rDBo0yDO+YMECo1WrVsbJkyfrzTd8+HBj7ty5xksvvWQ4HA5j06ZNnuf+8Ic/XPR3crlcRps2bYwPPvjAE29iYqLhcrnqve/cuXON4cOH15uWlpZmTJkyxTNe97k89thjnmlbt241JBlOp9MwDMN45ZVXDIfD0WieVsCau4X90z/9k2w2m2d86NCh+uKLL1RTU6Ndu3YpMzNTXbt2VVxcnIYPHy5J+uqrryRJM2fO1KpVq3Tttdfq//2//6dPPvmk0eV4My8QKvr37+95HBkZqfbt2+sHP/iBZ1piYqIkeXZn7d+/X0OHDq1Xc8OGDVN5ebmOHj2qw4cPq6qqSjfccIPn+YSEBPXq1curuJKTkzV27FgtX75ckvTee+/J5XLpnnvuueTrrrnmGkVEnP/KT0xMrJdPXY4X7p574403NGzYMHXu3FmxsbF69NFHPd8RddLS0i46TkCSVq9erV/84hf66KOPPN8vkrRnzx4dOnRIcXFxio2NVWxsrBISElRZWanDhw975vvBD37Q5P33F35WdZ/LpT6rcEBzD0OVlZUaNWqU4uPj9dprr2nnzp1as2aNJHk2i40ZM0ZffvmlfvGLX+j48eO65ZZbGt105c28QKho1apVvXGbzVZvWl0Tr62tDWhckvSTn/xEq1at0tmzZ/XKK69o4sSJatu27SVfc7l86qbV5bN161ZNnjxZt99+u9atW6fPPvtMv/zlL+ttOpdU78j+C1133XXq2LGjli9f7jnWR5LKy8s1aNAgFRYW1hv+9re/6cc//vFl3/dyudV9LsHyWZmF5m5h27dvrze+bds29ezZUwcOHNA//vEPPf3000pPT1fv3r0b/EXbsWNHZWVl6dVXX9XixYv129/+ttFleTMvYEV9+vTR1q1b6zWyP//5z4qLi1NKSoquuuoqtWrVql5dnjp1Sn/729+8Xtbtt9+umJgY5ebmKj8/X/fff79PcrjQJ598orS0NP3yl7/U9ddfr549e+rLL79s8uuvuuoq/elPf9LatWs1Z84cz/SBAwfqiy++UKdOndSjR496Q6BO9YuOjlZNTU1AlmUWmruFffXVV5o/f74OHjyolStX6r//+781d+5cde3aVdHR0frv//5v/d///Z/effdd/cd//Ee91z7++ONau3atDh06pL/+9a9at26d+vTp0+ByvJkXsKoHH3xQxcXFmjNnjg4cOKC1a9dqwYIFmj9/viIiIhQbG6sZM2bo4Ycf1saNG/X5559r2rRp9TaVN1VkZKSmTZum7Oxs9ezZU0OHDvV5Pj179tRXX32lVatW6fDhw3rxxRc9W/ia6uqrr9af/vQnvf32256L2kyePFkdOnTQ+PHjVVBQoCNHjmjTpk36+c9/Xu9gPn/q1q2bysvLtWHDBv3973/3HBRp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PF9RUaH58+fr008/1YYNGxQREaE777zTcw/iF198Ue+++67efPNNHTx4UK+99lq9xnrPPffo5MmTWr9+vXbt2qWBAwfqlltu0bfffquJEyfq448/liTt2LFDTqdTqampkty/9tevX6/8/HytXLlSy5Yt09ixY3X06FFt3rxZ//mf/6lHH31U27dv9/xN6nJ2Op2eccDXrPYdcDnPPfecrr/+en322Wd68MEHNXPmTB08eFCSdO7cOY0aNUpxcXEqKCjQn//8Z8XGxmr06NGqqqrSQw895Imp7na3dTZu3Kjjx49ry5YtWrRokRYsWKBx48bpiiuu0Pbt2/XAAw/oZz/7mY4ePSrJ/R0hSR9//LGcTqelb7LkFZ+crBfmhg8fbtx4442e8erqaiMmJsa47777PNOcTqchydi6dathGIbx7//+70avXr2M2tpazzxLliwxYmNjjZqaGqOsrMyIjo423nzzTc/z//jHP4w2bdoYc+fO9UxLS0sznn/+ec/4+PHjjaysLM/4sWPHjMjISGP79u2GYRhGVVWV0aFDB2PFihWN5pOVlWUkJCQYFRUVnmm5ubme2BryzTffGJKMvXv3GoZhGHPmzDFGjBhRL786BQUFRnx8vFFZWVlv+lVXXWX85je/MQzDMD777DNDknHkyBHP8wsWLDDatm1rlJaWeqaNGjXK6NatW724evXqZeTk5HjGJRlr1qxpNF+gpaz4HXDhrUiHDx9+0TKnTJniGa+trTU6depk5ObmGoZhGH/4wx8uys3lchlt2rQxPvjgA8MwDGPNmjXG91tQVlaWkZaWdlE9p6ene8br/rYrV640DMMwjhw5YkgyPvvss0bzCUesuftI//79PY8jIyPVvn17z6ZlSUpMTJQknTx5UpL7YJKhQ4fW29c0bNgwlZeX6+jRozp8+LCqqqp0ww03eJ5PSEhQr169vIorOTlZY8eO1fLlyyVJ7733nlwul+65555Lvm7AgAFq27atZ3zo0KEqLy9XcXGxJOmLL77QpEmTdOWVVyo+Pt6zVv7VV19Jcm9eKywsVK9evfTzn/9cH374oee99uzZo/LycrVv395zN6zY2FgdOXKk3qb9hnTr1k1xcXGe8cTERPXt27feHbQSExM9f2cgUKz2HXA5F+Zrs9nUuXNnT2579uzRoUOHFBcX56nvhIQEVVZWXrbGr7nm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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "## 柱状图的数据\n", - "fig, ax = plt.subplots(2, 2, figsize=(6, 6))\n", - "ax[0,0].stem(x, y)\n", - "ax[0,0].set_title('basis',size=10)\n", - "#(1)每个数据点处使用红色圆圈标记;\n", - "ax[0,1].stem(x, y, markerfmt='ro')\n", - "ax[0,1].set_title('modify markerfmt',size=10)\n", - "#(2)用绿色实线作为基线\n", - "ax[1,0].stem(x, y, markerfmt='ro', basefmt='g-')\n", - "ax[1,0].set_title('modify basefmt',size=10)\n", - "#(3)蓝色虚线连接垂直线。\n", - "ax[1,1].stem(x, y, markerfmt='ro', basefmt='g-', linefmt='b--')\n", - "ax[1,1].set_title('modify linefmt',size=10)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## `.pie()` 饼图\n", - "\n", - "用于表示整体中各部分的相对比例。它通常以圆形的方式展示数据,将整个圆分为扇形,每个扇形的角度表示相应部分占总体的比例。通常用于展示分类数据的占比比较。\n", - "\n", - "例:对一个列表画图,需要先统计不同元素出现的次数,转为字典,将字典中的值作为数据,字典中的键作为标签参数传入。\n", - "\n", - "- `autopct='%1.1f%%'` 参数用于显示每个元素占比的百分比,`%1.1f` 这部分是格式说明符,表示显示一个浮点数,其中包含一位小数;`%%` 是一个转义序列,用于显示百分号;\n", - "\n", - "- `color` 参数用于自定义每个部分的颜色。\n", - "\n", - "- `startangle` 参数设置起始角度为 45 度。" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "统计结果为{'A': 2, 'B': 1, 'C': 1}\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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66Uf+sE/CxYLDwKT4jEKpHliMA6C0Pqvff5gJw1jFIiIKEQn9QBERCQfjAIREYUwCkREFMIoEBFRCKNAREQhjAIREYUwCkREFMIokGYsWbIEgiCEPlJSUjBv3jwcOnRI6tGIZINRIE2ZN28eKisrUVlZiU2bNsFgMOC2226Teiwi2WAUSFNMJhMyMjKQkZGB8ePH47HHHsP58+dRW1sr9WhEssAokGbZbDa88cYbyM7ORkpKitTjEMmCQeoBiKKpoKAA8ZducG+325GZmYmCggLodPz3ERHAlQJpzJw5c3DgwAEcOHAARUVFuOWWWzB//nycPXtW6tGIZIFRIE2Ji4tDdnY2srOzMWXKFLz88suw2+146aWXpB6NSBYYBdI0QRCg0+nglMOd24hkgMcUSFPcbjeqqqoAAA0NDVi5ciVsNhvy8vIknoxIHhgF0pSNGzciMzMTAGC1WjFixAi8++67mD17trSDEckE77xGREQhPKZAREQhjAIREYUwCkREFMIoEBFRCKNAREQhjAIREYUwCkREFMIoEBFRCKNAREQhjAIREYUwCkREFMIoEBFRCKNAREQhjAIREYUwCkREFMIoEBFRCKNAREQhjAIREYUwCkREFMIoEBFRCKNAREQhjAIREYUwCkREFMIoEBFRCKNAREQhjAIREYUwCkREFPL/Afd02qhIjY3eAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "X = ['A','B','C','A']\n", - "# 统计各元素出现的次数\n", - "counts = {label: X.count(label) for label in set(X)}\n", - "print('统计结果为{}'.format(counts))\n", - "# 饼图\n", - "plt.pie(counts.values(), labels=counts.keys(), autopct='%1.1f%%', startangle=45, colors=['skyblue', 'lightcoral', 'lightgreen'])\n", - "plt.legend()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## `.hist()` 直方图\n", - "\n", - "直方图是一种用于可视化数据分布的图表类型,通过将数据划分为多个连续的区间(也称为箱子或柱 (`bins`)),并在每个区间内绘制相应的频率或数量来展示数据的分布情况。直方图常用于了解连续型数据(有连续取值的变量,比如身高、体重)的中心趋势、离散程度和异常值。\n", - "\n", - "该函数也有类似的许多参数,比较重要的是设置分箱数 `bins`,请看下例对随机生成的 200 个正态分布数据分别分为 8 组和 18 组的作图情况:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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8AEAAExF+AAAAKYifAAAAFMRPgAAgKkIHwAAwFSEDwAAYCq/hY8FCxYoISFBYWFh6tOnjz799FN/TQUAAIKIX8LH6tWrlZmZqezsbO3du1fdu3fX4MGDderUKX9MBwAAgohfwseLL76oiRMnavz48eratasWLVqkZs2a6Y033vDHdAAAIIj4fFfbCxcuqLi4WFlZWe5zjRo10qBBg7R79+6L+judTjmdTvex3W6XJDkcDl+XpvLyCrmc530+7vWmotxR76+zIVyjxHXWJw3hGiWusz4pL3fIYXVdc/8ff29f0672ho999913hiTj448/9jj/5JNPGrfddttF/bOzsw1JNBqNRqPR6kErKyu7albw+Z0Pb2VlZSkzM9N97HK5dObMGUVGRspisQSwMnM5HA7FxsaqrKxMERERgS7HNFw3190QcN1cd0NgGIbKy8sVExNz1b4+Dx+tW7dWSEiITp486XH+5MmTatOmzUX9rVarrFarx7mWLVv6uqygERER0aD+Yf0R192wcN0NC9fdcNhstmvq5/MFp02aNNGtt96q999/333O5XLp/fffV0pKiq+nAwAAQcYvj10yMzM1btw49erVS7fddpvmz5+vyspKjR8/3h/TAQCAIOKX8PHAAw/o9OnTevrpp3XixAndcsst2rJli37yk5/4Y7p6wWq1Kjs7+6JHUPUd1811NwRcN9cNTxbDuJbvxAAAAPgGe7sAAABTET4AAICpCB8AAMBUhA8AAGAqwkeA7dq1S8OGDVNMTIwsFovWr18f6JJMkZOTo969eys8PFzR0dEaMWKESkpKAl2W3+Xm5io5Odn98qGUlBRt3rw50GWZbt68ebJYLMrIyAh0KX41e/ZsWSwWj9a5c+dAl2WK7777Tg8//LAiIyPVtGlT3XzzzdqzZ0+gy/KrhISEi/68LRaL0tPTA13adYfwEWCVlZXq3r27FixYEOhSTFVQUKD09HQVFhZq27Ztqq6uVmpqqiorKwNdml+1a9dO8+bNU3Fxsfbs2aO7775b9913n7788ktT5v/xl+H3339/xX4JCQl69NFH/VJDUVGRFi9erOTkZL+Mf73p1q2bjh8/7m4ffvhhoEvyu7Nnz6pv375q3LixNm/erK+++kovvPCCbrjhhkCX5ldFRUUef9bbtm2TJI0aNSrAlV1/Ar63S0OXlpamtLS0QJdhui1btngc5+XlKTo6WsXFxerXr1+AqvK/YcOGeRzPnTtXubm5KiwsVLdu3QJUlXkqKio0ZswYLV26VM8884zXn8/NzdWOHTv0ySefqKysTOPGjVNeXt4l+xYXFys7O1t79uxRRUWFOnTooF/96ldKT09XSEhIHa/k2oWGhl5ya4n67LnnnlNsbKyWLVvmPte+ffsAVmSOqKgoj+N58+YpMTFR/fv3D1BF1y/ufOC6YLfbJUmtWrUKcCXmqampUX5+viorK6+7rQdKSkq0dOlSn4+bnp6uoUOHatCgQbX6/HPPPacdO3aoW7duCg29/N+diouLdccdd+jw4cOaOXOmXnjhBXXo0EHTpk3z2MjSDN98841iYmLUoUMHjRkzRkePHjV1/kDYuHGjevXqpVGjRik6Olo9evTwyz9P17MLFy5oxYoVmjBhQoPaJPVacecDAedyuZSRkaG+ffsqKSkp0OX43f79+5WSkqKqqiq1aNFC69atU9euXQNdlgd/vJkxPz9fe/fuVVFRUa3HKCgoUFxcnCwWi1q0aHHZfosXL5b0rzVVPwbaSZMmqX///srLy9PLL79c6xq80adPH+Xl5alTp046fvy45syZo7vuuksHDhxQeHi4KTUEwrfffqvc3FxlZmbqqaeeUlFRkaZOnaomTZpo3LhxgS7PFOvXr9e5c+f89vgy2HHnAwGXnp6uAwcOKD8/P9ClmKJTp07at2+fPvnkE/3Xf/2Xxo0bp6+++srUGr7//nuNHj1aERERioyM1LRp01RVVeX++X+u+cjLy5PFYtFHH32kzMxMRUVFqXnz5ho5cqROnz7tMfaePXs0ePBgtW7dWk2bNlX79u31wAMPaNq0aVq5cqXCwsJqXXd8fPw1/S3S4XAoLCzsoh2y27Ztq6ZNm9Z6fm+lpaVp1KhRSk5O1uDBg/Xuu+/q3LlzWrNmjWk1BILL5VLPnj317LPPqkePHnrsscc0ceJELVq0KNClmeb1119XWlraNW0v3xBx5wMBNXnyZG3atEm7du1Su3btAl2OKZo0aaKOHTtKkm699VYVFRXp5Zdfdv9t3QyjR49WQkKCcnJyVFhYqFdeeUVnz57Vm2++ecXPTZkyRTfccIOys7N1+PBhzZ8/X5MnT9bq1aslSadOnVJqaqqioqI0a9YstWzZUocPH9by5ct16tQp9ezZU5JkGIZcLpcKCgr06quv6tixY5dch9GsWTM1a9bM6+sbMGCAVq9erUmTJikzM1PNmjXT5s2b9fbbb+uPf/yj1+P5SsuWLXXTTTfp4MGDAavBDG3btr3obl6XLl301ltvBagicx05ckTbt2/X22+/HehSrluEDwSEYRiaMmWK1q1bp507dzaIxWiX43K55HQ6TZ2zffv22rBhg6R/3XmKiIjQwoULNWPGjCt+CyUyMlLvvfee++6Dy+XSK6+8IrvdLpvNpo8//lhnz57Ve++9p169erk/N3PmTB05csR9PHjwYB07dsw9xuUWZGZnZ2v27NleX9/EiRP15ZdfavHixfrTn/4kSQoJCdFrr72mxx9/3OvxfKWiokKlpaUaO3ZswGowQ9++fS/66vzXX3+t+Pj4AFVkrmXLlik6OlpDhw4NdCnXLcJHgFVUVHj8LejQoUPat2+fWrVqpbi4uABW5l/p6elatWqVNmzYoPDwcJ04cUKSZLPZTL0tbrasrCylpaUpLi5O5eXlWrVqlXbu3KmtW7eaWsd/vndgypQpWrhwod59990rho/HHnvM47HHXXfdpZdeeklHjhxRcnKy+zHHpk2b1L17dzVu3FiSFB4e7rGeZ82aNfr1r3+txMRE/frXv77sfB06dKjN5SkkJESJiYkaPHiwRo0apbCwMP35z3/WlClT1KZNG40YMaJW43prxowZGjZsmOLj43Xs2DFlZ2crJCREDz74oCnzB8r06dN1xx136Nlnn9Xo0aP16aefasmSJVqyZEmgS/M7l8ulZcuWady4cVdcFN3gGQiov/71r4aki9q4ceMCXZpfXeqaJRnLli0LdGl+NWHCBCM+Pt5o0qSJERUVZQwcONB47733TJs/OzvbkGR8++23HucvXLhgNGrUyJg0aZJhGIYRHx/v8c/gsmXLDElGYWGhx+d+/Od3586dhmEYhsvlMu6//35DkhEREWEMHz7ceOONN4yqqqqLaunfv78xbdq0Wl9L8+bNL/vvSU5OjtGmTRujvLzc4/yAAQOMmJgYo7q6utbzeuOBBx4w2rZtazRp0sT46U9/ajzwwAPGwYMHTZk70N555x0jKSnJsFqtRufOnY0lS5YEuiRTbN261ZBklJSUBLqU6xqxLMAGDBggwzACXYbpGuI1S/9ahHY9utavAl7u/Rg//nlaLBatXbtWhYWFeuedd7R161ZNmDBBL7zwggoLC93fUDl9+rR7gfGPd70upUWLFlf8VsvlLFy4UHffffdFnx0+fLgyMzN1+PBh97obf2ooi6gv5ec//7l+/vOfB7oM06WmpjbY/755g2+7AA3QN99843F88OBBuVwuJSQk+GT822+/XXPnztWePXu0cuVKffnllx6/iHv37q22bdtetT3//PO1mv/kyZOqqam56Hx1dbUk6YcffqjdhQHwCe58AA3QggULlJqa6j5+9dVXJanOb9s9e/asWrZs6XEn5ZZbbpEkj0W1K1eu1D//+c+rjlfbNR833XSTtm3bpn/84x+KjIyU9K+Xuq1Zs0bh4eFKTEys1bgAfIPwATRAhw4d0vDhwzVkyBDt3r1bK1as0EMPPaTu3bvXadzly5dr4cKFGjlypBITE1VeXq6lS5cqIiJC9957r7tf3759azX+O++8o88//1zSv+5ifPHFF+7XtA8fPty9WHbWrFl6+OGH1adPHz322GNq2rSp/vznP6u4uFjPPPOMeyEsgMAgfAAN0OrVq/X0009r1qxZCg0N1eTJk33y/ov+/fvr008/VX5+vk6ePCmbzabbbrtNK1eu9MnXqd966y0tX77cffzZZ5/ps88+k/SvTft+DB9jxoxR69atlZOToz/+8Y9yOBzq1KmTFi1apEmTJtW5DgB1YzFYGQMAAEzEglMAAGAqwgcAADCVV+Fj9uzZslgsHq1z584efXbv3q27775bzZs3V0REhPr163dNq9oBAEDD4PWC027dumn79u3/N8C/vT529+7dGjJkiLKysvTqq68qNDRUn3/+uRo14gYLAAD4F6/DR2ho6GU3gZo+fbqmTp2qWbNmuc916tSp9tUBAIB6x+vw8c033ygmJkZhYWFKSUlRTk6O4uLidOrUKX3yyScaM2aM7rjjDpWWlqpz586aO3eu7rzzzsuO53Q6PV4+5HK5dObMGUVGRl7zK58BAEBgGYah8vJyxcTEXP2Jhzcbwbz77rvGmjVrjM8//9zYsmWLkZKSYsTFxRkOh8PYvXu3Iclo1aqV8cYbbxh79+41MjIyjCZNmhhff/31Zcf8caMrGo1Go9Fowd/Kysqumifq9J6Pc+fOKT4+Xi+++KK6dOmivn37KisrS88++6y7T3JysoYOHaqcnJxLjvGfdz7sdrvi4uJUVlamiIiI2pYGAABM5HA4FBsbq3Pnzslms12xb53ecNqyZUvddNNNOnjwoO6++25JUteuXT36dOnSRUePHr3sGFarVVar9aLzERERhA8AAILMtSyZqNPXUCoqKlRaWqq2bdsqISFBMTExKikp8ejz9ddfKz4+vi7TAACAesSrOx8zZszQsGHDFB8fr2PHjik7O1shISF68MEHZbFY9OSTTyo7O1vdu3fXLbfcouXLl+tvf/ub1q5d66/6AQBAkPEqfPz973/Xgw8+qH/84x+KiorSnXfeqcLCQkVFRUmSMjIyVFVVpenTp+vMmTPq3r27tm3bxvbVAADA7brbWM7hcMhms8lut7PmAwCAIOHN729ePQoAAExF+AAAAKYifAAAAFMRPgAAgKkIHwAAwFSEDwAAYCrCBwAAMBXhAwAAmIrwAQAATEX4AAAApqpT+Jg3b54sFosyMjLc50pLSzVy5EhFRUUpIiJCo0eP1smTJ+taJwAAqCdqHT6Kioq0ePFiJScnu89VVlYqNTVVFotFO3bs0EcffaQLFy5o2LBhcrlcPikYAAAEt1qFj4qKCo0ZM0ZLly7VDTfc4D7/0Ucf6fDhw8rLy9PNN9+sm2++WcuXL9eePXu0Y8cOnxUNAACCV63CR3p6uoYOHapBgwZ5nHc6nbJYLLJare5zYWFhatSokT788MNLjuV0OuVwODwaAACov7wOH/n5+dq7d69ycnIu+tntt9+u5s2ba+bMmTp//rwqKys1Y8YM1dTU6Pjx45ccLycnRzabzd1iY2O9vwoAABA0vAofZWVlmjZtmlauXKmwsLCLfh4VFaW//OUveuedd9SiRQvZbDadO3dOPXv2VKNGl54qKytLdrvd3crKymp3JQAAICiEetO5uLhYp06dUs+ePd3nampqtGvXLr322mtyOp1KTU1VaWmpvv/+e4WGhqply5Zq06aNOnTocMkxrVarx2MaAABQv3kVPgYOHKj9+/d7nBs/frw6d+6smTNnKiQkxH2+devWkqQdO3bo1KlTGj58uA/KBQAAwc6r8BEeHq6kpCSPc82bN1dkZKT7/LJly9SlSxdFRUVp9+7dmjZtmqZPn65OnTr5rmoAABC0vAof16KkpERZWVk6c+aMEhIS9N///d+aPn26r6cBAABBymIYhhHoIv6dw+GQzWaT3W5XREREoMsBAADXwJvf3+ztAgAATEX4AAAApiJ8AAAAUxE+AACAqQgfAADAVIQPAABgKsIHAAAwFeEDAACYivABAABMRfgAAACmqlP4mDdvniwWizIyMiRJZ86c0ZQpU9SpUyc1bdpUcXFxmjp1qux2uy9qBQAA9UCtN5YrKirS4sWLlZyc7D537NgxHTt2TM8//7y6du2qI0eO6PHHH9exY8e0du1anxQMAACCW63CR0VFhcaMGaOlS5fqmWeecZ9PSkrSW2+95T5OTEzU3Llz9fDDD+uHH35QaKjPN9EFAABBplaPXdLT0zV06FANGjToqn1/3N3ucsHD6XTK4XB4NAAAUH95fSsiPz9fe/fuVVFR0VX7fv/99/rDH/6gxx577LJ9cnJyNGfOHG/LAAAAQcqrOx9lZWWaNm2aVq5cqbCwsCv2dTgcGjp0qLp27arZs2dftl9WVpbsdru7lZWVeVMSAAAIMhbDMIxr7bx+/XqNHDlSISEh7nM1NTWyWCxq1KiRnE6nQkJCVF5ersGDB6tZs2batGnTVYPKv3M4HLLZbO7HNQAA4Prnze9vrx67DBw4UPv37/c4N378eHXu3FkzZ85USEiIHA6HBg8eLKvVqo0bN3oVPAAAQP3nVfgIDw9XUlKSx7nmzZsrMjJSSUlJcjgcSk1N1fnz57VixQqPBaRRUVEed0wAAEDD5NPvvu7du1effPKJJKljx44ePzt06JASEhJ8OR0AAAhCXq35MANrPgAACD7e/P5mbxcAAGAqwgcAADAV4QMAAJiK8AEAAExF+AAAAKYifAAAAFMRPgAAgKkIHwAAwFSEDwAAYCrCBwAAMJVX4SM3N1fJycmKiIhQRESEUlJStHnzZvfPBwwYIIvF4tEef/xxnxcNAACCl1cby7Vr107z5s3TjTfeKMMwtHz5ct1333367LPP1K1bN0nSxIkT9fvf/979mWbNmvm2YgAAENS8Ch/Dhg3zOJ47d65yc3NVWFjoDh/NmjVTmzZtfFchAACoV2q95qOmpkb5+fmqrKxUSkqK+/zKlSvVunVrJSUlKSsrS+fPn7/iOE6nUw6Hw6MBAID6y6s7H5K0f/9+paSkqKqqSi1atNC6devUtWtXSdJDDz2k+Ph4xcTE6IsvvtDMmTNVUlKit99++7Lj5eTkaM6cObW/AgAAEFQshmEY3nzgwoULOnr0qOx2u9auXas//elPKigocAeQf7djxw4NHDhQBw8eVGJi4iXHczqdcjqd7mOHw6HY2FjZ7XZFRER4eTkAACAQHA6HbDbbNf3+9jp8/KdBgwYpMTFRixcvvuhnlZWVatGihbZs2aLBgwdf03jeFA8AAK4P3vz+rvN7Plwul8edi3+3b98+SVLbtm3rOg0AAKgnvFrzkZWVpbS0NMXFxam8vFyrVq3Szp07tXXrVpWWlmrVqlW69957FRkZqS+++ELTp09Xv379lJyc7K/6AQBAkPEqfJw6dUqPPPKIjh8/LpvNpuTkZG3dulX33HOPysrKtH37ds2fP1+VlZWKjY3V/fffr9/+9rf+qh0AAAShOq/58DXWfAAAEHxMXfMBAADgDcIHAAAwFeEDAACYivABAABMRfgAAACmInwAAABTET4AAICpCB8AAMBUhA8AAGAqwgcAADCVV+EjJydHvXv3Vnh4uKKjozVixAiVlJR49Dlx4oTGjh2rNm3aqHnz5urZs6feeustnxYNAACCl1fho6CgQOnp6SosLNS2bdtUXV2t1NRUVVZWuvs88sgjKikp0caNG7V//3794he/0OjRo/XZZ5/5vHgAABB86rSx3OnTpxUdHa2CggL169dPktSiRQvl5uZq7Nix7n6RkZF67rnn9Ktf/eqqY7KxHAAAwce0jeXsdrskqVWrVu5zd9xxh1avXq0zZ87I5XIpPz9fVVVVGjBgwCXHcDqdcjgcHg0AANRftQ4fLpdLGRkZ6tu3r5KSktzn16xZo+rqakVGRspqtWrSpElat26dOnbseMlxcnJyZLPZ3C02Nra2JQEAgCBQ6/CRnp6uAwcOKD8/3+P87373O507d07bt2/Xnj17lJmZqdGjR2v//v2XHCcrK0t2u93dysrKalsSAAAIArVa8zF58mRt2LBBu3btUvv27d3nS0tL1bFjRx04cEDdunVznx80aJA6duyoRYsWXXVs1nwAABB8vPn9HerNwIZhaMqUKVq3bp127tzpETwk6fz585KkRo08b6iEhITI5XJ5MxUAAKinvAof6enpWrVqlTZs2KDw8HCdOHFCkmSz2dS0aVN17txZHTt21KRJk/T8888rMjJS69ev17Zt27Rp0ya/XAAAAAguXj12sVgslzy/bNkyPfroo5Kkb775RrNmzdKHH36oiooKdezYUTNmzPD46u2V8NgFAIDg483v7zq958MfCB/A9eN0uVOO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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "np.random.seed(1)\n", - "x = 4 + np.random.normal(0, 1.5, 200)\n", - "fig, ax = plt.subplots(2,1)\n", - "\n", - "ax[0].hist(x, bins=8, linewidth=0.5, edgecolor=\"white\")\n", - "ax[0].set_title('bins=8')\n", - "ax[0].set(xlim=(0, 8), xticks=np.arange(1, 8),\n", - " ylim=(0, 56), yticks=np.linspace(0, 56, 9))\n", - "\n", - "\n", - "ax[1].hist(x, bins=18, linewidth=0.5, edgecolor=\"white\")\n", - "\n", - "ax[1].set(xlim=(0, 8), xticks=np.arange(1, 8),\n", - " ylim=(0, 56), yticks=np.linspace(0, 56, 9))\n", - "ax[1].set_title('bins=18')\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## `.boxplot()` 箱线图\n", - "\n", - "箱线图是一种用于汇总和比较多个数据集分布的有效可视化工具,可以显示数据的中心趋势、离散程度以及异常值情况。\n", - "参数有:\n", - "- `positions`:设置箱线图的位置,即在 x 轴上的位置。\n", - "- `widths`:设置箱体的宽度。\n", - "- `patch_artist=True`:将箱体以及中位数点着色。\n", - "- `showmeans=False/True` 和 `showfliers=False/True`:是否显示均值点和异常值。\n", - "- `medianprops`, `boxprops`, `capprops`:用于设置中位数线、箱体和异常值的样式,具体设置可以用字典的形式表示,比如 {'color':'white','linewidth':0.5}。\n", - "\n", - "例:对随机生成的 100 行和 3 列的三维正态分布的数据作出三组箱线图。" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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/86EVQAAhqnu7m6NGzfufY/J64feZTIZvfnmmyorK5PP57OOM+wlk0lVV1eru7ubhwjCHN+PyCd8P364stmsent7NXbsWBUUvP99MXm1jsj/VVBQ8B+bFM5eeXk5f9GQN/h+RD7h+/HDEwwGz+i4vFpHBAAAeAtFBAAAmKGIeEggENADDzzAWi3IC3w/Ip/w/WgnryerAgCAcxtnRAAAgBmKCAAAMEMRAQAAZigiAADADEXEA6LRqK644gqVlZWpsrJSTU1N2r17t3UsQJL0yCOPyOfz6a677rKOAo/6xz/+oS9/+cu64IILVFJSorq6Or3yyivWsTyDIuIBW7duVUtLi7Zt26bnn39e/f39uu6663Ts2DHraPC4l19+WT/60Y80adIk6yjwqCNHjmjGjBkqKirS+vXrtWvXLq1YsUKjRo2yjuYZ3L7rQYcOHVJlZaW2bt2qa665xjoOPOro0aOaMmWKfvjDH+pb3/qWJk+erJUrV1rHgsfcd999eumllxSPx62jeBZnRDwokUhIks4//3zjJPCylpYWXX/99Zo9e7Z1FHjYb37zG02dOlU333yzKisrddlll+mJJ56wjuUpFBGPyWQyuuuuuzRjxgzV1tZax4FHPf3009qxY4ei0ah1FHjc66+/rlWrVuniiy/Whg0btHjxYn3ta1/TU089ZR3NM/L66bv48LW0tKirq0svvviidRR4VHd3t+688049//zzKi4uto4Dj8tkMpo6dara2tokSZdddpm6urr02GOPaeHChcbpvIEzIh5y++23q6OjQ5s3b9a4ceOs48Cjtm/froMHD2rKlCkqLCxUYWGhtm7dqu9///sqLCxUOp22jggPqaqq0sSJEwft+9SnPqUDBw4YJfIezoh4QDab1R133KG1a9dqy5YtqqmpsY4ED5s1a5ZeffXVQftuueUWXXLJJbr33nvl9/uNksGLZsyYcdpyBnv27NHHP/5xo0TeQxHxgJaWFq1Zs0bPPvusysrK9NZbb0mSgsGgSkpKjNPBa8rKyk6bn/SRj3xEF1xwAfOW4Lq7775b9fX1amtr0+c//3n96U9/0uOPP67HH3/cOppncPuuB/h8viH3r169WosWLXI3DDCEmTNncvsuzHR0dCgSiWjv3r2qqanRkiVLdOutt1rH8gyKCAAAMMNkVQAAYIYiAgAAzFBEAACAGYoIAAAwQxEBAABmKCIAAMAMRQQAAJihiAAAADMUEQAAYIYiAgAAzFBEAACAGYoIAAAw8/8A+KAHqiRm0JIAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "np.random.seed(10)\n", - "#生成一个包含 100 行和 3 列的三维正态分布的数据\n", - "#均值分别为 (3, 5, 4),标准差分别为 (1.25, 1.00, 1.25)\n", - "D = np.random.normal((3, 5, 4), (1.25, 1.00, 1.25), (100, 3))\n", - "# plot\n", - "fig, ax = plt.subplots()\n", - "ax.boxplot(D, positions=[2, 4, 6], widths=1.5, patch_artist=True,\n", - " showmeans=False, showfliers=True,\n", - " medianprops={\"color\": \"white\", \"linewidth\": 0.5},\n", - " boxprops={\"facecolor\": \"C0\", \"edgecolor\": \"white\",\n", - " \"linewidth\": 0.5},\n", - " capprops={\"color\": \"C0\", \"linewidth\": 1.5})\n", - "\n", - "plt.show()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_sources/ch-numpy/index.md b/docs/_sources/ch-numpy/index.md deleted file mode 100644 index 85b54aa4..00000000 --- a/docs/_sources/ch-numpy/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# NumPy - -本节主要讲解如何使用 NumPy 进行高维数组计算。 - -```{tableofcontents} -``` \ No newline at end of file diff --git a/docs/_sources/ch-numpy/ndarray-slicing-index.ipynb b/docs/_sources/ch-numpy/ndarray-slicing-index.ipynb deleted file mode 100644 index 46d4be6e..00000000 --- a/docs/_sources/ch-numpy/ndarray-slicing-index.ipynb +++ /dev/null @@ -1,341 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 切片与索引\n", - "\n", - "索引(Index)从 `ndarray` 里定位所需要的数据,切片(Slice)从 `ndarray` 里选择一些数据。切片和索引都是在 `ndarray` 上选择所需要的数据。\n", - "\n", - "无论是索引还是切片,都需要一个 Index 标号来定位从左往右或者从右往左第几个数据是我们想要的数据。从左往右时起始位置从 0 开始,即 Index = 0 是整个 `ndarray` 最左侧元素;从右往左索引时起始位置从 - 1 开始,即 Index = -1 表示最右侧元素。" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 一维数组" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# 生成一维数组\n", - "a = np.array([2,0,2,3,9,2,3,4])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 索引\n", - "\n", - "假如我们想查找数组 a 中 Index 为 4 的元素,即查找第 5 个元素。刚才提到,Index 标号从 0 开始,所以 Index = 4 意味着第 5 个元素。" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "a[4]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 切片\n", - "\n", - "对数组 `a` 切片的语法为 :`a[start:end:step]`,其中 `start` 为起始 Index,`end` 为结束 Index,`step` 为步长。切片后,我们就得到了从 `start` 开始,到 `end` 结束的子串。注意,不包括 `end`。" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([2, 2, 9])" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "a[0:6:2]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 多维数组" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[ 0, 1, 2],\n", - " [ 3, 4, 5],\n", - " [ 6, 7, 8],\n", - " [ 9, 10, 11]],\n", - "\n", - " [[12, 13, 14],\n", - " [15, 16, 17],\n", - " [18, 19, 20],\n", - " [21, 22, 23]],\n", - "\n", - " [[24, 25, 26],\n", - " [27, 28, 29],\n", - " [30, 31, 32],\n", - " [33, 34, 35]]])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "b = np.arange(36).reshape((3,4,3))\n", - "b" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 索引\n", - "\n", - "多维数组要对每个维度分别进行索引,不同维度之间用逗号 `,` 隔开。" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "11" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "b[0,3,2]" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "19" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "b[1,2,1]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "19" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "b[-2,-2,-2]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 切片\n", - "\n", - "如果想切出第 0 维所有内容,可以使用冒号 `:`,表示该维度所有内容均保留。" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 6, 18, 30])" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "b[:,2,-3]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "每个维度切片方法与一维数组相同,不同维度之间用逗号 `,` 隔开。比如下面的例子,也可以使用 `start:stop:step` 的方式。" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[ 3, 4, 5],\n", - " [ 9, 10, 11]],\n", - "\n", - " [[15, 16, 17],\n", - " [21, 22, 23]],\n", - "\n", - " [[27, 28, 29],\n", - " [33, 34, 35]]])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "b[:,1:4:2,:]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "保留了前两个维度,`::2` 最后一个维度步长为2。没有写 `start` 和 `stop`,表示使用该维度原有的 `start` 和 `stop`。" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[ 0, 2],\n", - " [ 3, 5],\n", - " [ 6, 8],\n", - " [ 9, 11]],\n", - "\n", - " [[12, 14],\n", - " [15, 17],\n", - " [18, 20],\n", - " [21, 23]],\n", - "\n", - " [[24, 26],\n", - " [27, 29],\n", - " [30, 32],\n", - " [33, 35]]])" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "b[:,:,::2]" - ] - } - ], - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_sources/ch-numpy/ndarray.ipynb b/docs/_sources/ch-numpy/ndarray.ipynb deleted file mode 100644 index f26c1269..00000000 --- a/docs/_sources/ch-numpy/ndarray.ipynb +++ /dev/null @@ -1,1130 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "61d699fe", - "metadata": {}, - "source": [ - "(numpy-ndarray)=\n", - "# ndarray\n", - "\n", - "NumPy 最核心的数据结构是多维数组(N-dimensional Array): `ndarray`。 `ndarray` 是由同一数据类型的数据组成的数组列表。" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "fc701292", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.699471Z", - "iopub.status.busy": "2023-09-23T02:14:27.699099Z", - "iopub.status.idle": "2023-09-23T02:14:27.840514Z", - "shell.execute_reply": "2023-09-23T02:14:27.839666Z" - } - }, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 数组 array\n", - "\n", - "数组 array (或 `ndarray`) 是 NumPy 最为核心的数据结构。array 里的数据类型是一致的,比如都是整数还是浮点数,数据类型被记录在了 `dtype` 里。\n", - "\n", - "数组可以通过非负整数元组、布尔、另一个数组或整数进行索引。数组的秩 `rank` 是维数。数组的形状 `shape` 给出了数组在每个维度上的大小。\n", - "\n", - "生成一个 NumPy array 最简单的一种方法是从 Python 列表(list)开始。" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1, 2, 3, 4])" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 数组 array\n", - "arr1 = np.array([1, 2, 3, 4])\n", - "arr1" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 1, 2, 3, 4],\n", - " [ 5, 6, 7, 8],\n", - " [ 9, 10, 11, 12]])" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr2 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])\n", - "arr2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "我们可以使用方括号来查找数组中的元素,查找元素的过程又被称为索引(Indexing)。 NumPy 中的索引从 0 开始:如果你想索引数组中的第一个元素,那就用 0 作为索引。" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1 2 3 4]\n" - ] - } - ], - "source": [ - "print(arr2[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "array 可以是一个数组,也可以是数组的数组,即高维数组。数组中的维数和项数由其形状 `shape` 决定。数组的形状 `shape` 是一组非负整数,指定每个维度的大小。\n", - "\n", - "在 NumPy 中,维度被称为轴线 `axes` 。\n", - "\n", - "例如,这有一个二维数组:\n", - "\n", - "```\n", - "[[0., 0., 0.],\n", - " [1., 1., 1.]]\n", - "```\n", - "\n", - "这个数组有两个轴 `axes` 。第一轴的长度为 2 ,第二轴的长度为 3 。" - ] - }, - { - "cell_type": "markdown", - "id": "0bee596e", - "metadata": {}, - "source": [ - "## 创建 `ndarray`\n", - "\n", - "array 的底层数据结构是 `ndarray`。\n", - "\n", - "`array()` 函数接收来自原生 Python 的各类数据,如列表、元组等,并转化为 `ndarray`;`array()` 函数也可以接收一个 NumPy 的 `ndarray`。数组中的数据类型必须是一致的。" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "154800db", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.844982Z", - "iopub.status.busy": "2023-09-23T02:14:27.844513Z", - "iopub.status.idle": "2023-09-23T02:14:27.852500Z", - "shell.execute_reply": "2023-09-23T02:14:27.851541Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1, 2, 3, 4])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 列表 list\n", - "ar1 = np.array([1,2,3,4])\n", - "ar1" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "dc7931f8", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.856321Z", - "iopub.status.busy": "2023-09-23T02:14:27.856054Z", - "iopub.status.idle": "2023-09-23T02:14:27.860735Z", - "shell.execute_reply": "2023-09-23T02:14:27.859948Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1, 2, 3, 4])" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 元组 tuple\n", - "ar2 = np.array((1,2,3,4))\n", - "ar2" - ] - }, - { - "cell_type": "markdown", - "id": "49448406", - "metadata": {}, - "source": [ - "## 数据类型:`dtype`\n", - "\n", - "在进一步深入了解各种创建 `ndarray` 的方式之前,我们需要了解一下数据类型的基础知识。计算机无法直接表征数值,其底层基于二进制表示数值,整数和浮点数(其实就是小数,计算机科学中一般称小数为浮点数)基于科学计数法,字符串是一个从整数到字符的映射。 NumPy 提供了不同的数据类型 `dtype`,不同的 `dtype` 所能表示的区间范围不同。比如,同为整数,就有以下几种类型,其所表示的数值区间差异较大。\n", - "\n", - "| dtype \t| 区间 \t|\n", - "|----------\t|-----------------------\t|\n", - "| np.int8 \t| -128 ~ 127 \t|\n", - "| np.int16 \t| -32768 ~ 32767 \t|\n", - "| np.int32 \t| $-2.1*10^9 \\sim 2.1*10 ^9$ \t|\n", - "\n", - "NumPy 所支持的数据类型主要有:\n", - "\n", - "* `np.bool_` :布尔类型\n", - "* `np.number` :又细分为整数(比如 `np.int8` 等)和浮点类型(`np.float32` 等)。\n", - "* `np.datetime64`:表示日期的数据类型\n", - "* `np.character`:字符串类型\n", - "\n", - "这些数据类型往往都带有一个数字,比如 `np.int8`,数字表示这个数据类型占用了多少个比特(bit)的存储空间。1 个 bit 为一个 0/1 二进制。8 bit = 1 byte,即 8 比特位等于 1 个字节。\n", - "\n", - "根据上表,整数占用的存储空间越大,所能表示的数值范围越大。当我们编写简单的程序时,数值范围一般不会出现问题,但是当我们编写复杂的科学计算程序时,数值范围决定了计算的精度。例如,`np.int8` 只能表示 -128 ~ 127 范围的数值,超过这个数值的数字,如何被 `np.int8` 表示,存在较大不确定性,进而造成程序运行不准确。\n", - "\n", - "占用的 bit 越多,数据越精准,但也会使得对内存消耗越大。选择合适的数据类型有助于节省内存。刚刚接触数据类型的朋友,对于如何选择合适数据类型并不熟悉。大概可以按照如下准则:\n", - "\n", - "* 整数类型默认是 `np.int64`,但很多应用 `np.32` 就足够了。\n", - "* 浮点数类型一般科学计算应用都使用 `np.float64`,深度学习类应用使用 `np.float32` 或者甚至更小的数据类型也足够了。\n", - "\n", - "## 创建特定的 `ndarray`\n", - "\n", - "### arange() 与 linspace()\n", - "\n", - "`arange()` 和 `linspace()` 函数可用于生成一个数值数组。数值从区间为 $[start,stop)$ 中选择,一般从 `start` 开始,到 `stop` 结束,在这个区间内生成一系列值。\n", - "\n", - "`arange()` 函数的常见形式:\n", - "\n", - "* `arange(stop)`\n", - "* `arange(start, stop)`\n", - "* `arange(start, stop, step)`\n", - "\n", - "其中,`step` 用于指定数值之间的间隔,默认为 1。\n", - "\n", - "以下两种方式是等效的。" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "2cdcfb21", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.863752Z", - "iopub.status.busy": "2023-09-23T02:14:27.863505Z", - "iopub.status.idle": "2023-09-23T02:14:27.868915Z", - "shell.execute_reply": "2023-09-23T02:14:27.868138Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.arange(10)\n", - "np.arange(stop=10)" - ] - }, - { - "cell_type": "markdown", - "id": "b2f3eae0", - "metadata": {}, - "source": [ - "`linspace()` 函数生成 `num` 个均匀间隔的数值,也就是创建一个等差数列。常见形式:`linspace(start, stop, num)`。\n", - "\n", - "生成在 1 和 5 之间 5 个均匀间隔的数组:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "4a05b43b", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.872613Z", - "iopub.status.busy": "2023-09-23T02:14:27.872277Z", - "iopub.status.idle": "2023-09-23T02:14:27.879506Z", - "shell.execute_reply": "2023-09-23T02:14:27.878895Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1., 2., 3., 4., 5.])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = np.linspace(1,5,5)\n", - "a" - ] - }, - { - "cell_type": "markdown", - "id": "aa645e7b", - "metadata": {}, - "source": [ - "### ones() 与 ones_like()\n", - "\n", - "`np.ones(shape)` 生成 `shape` 大小的、全为 1 数组。例如,生成 $3 \\times 3 \\times 6$ 的高维数组:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "ca7408c0", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.882826Z", - "iopub.status.busy": "2023-09-23T02:14:27.882516Z", - "iopub.status.idle": "2023-09-23T02:14:27.889284Z", - "shell.execute_reply": "2023-09-23T02:14:27.888622Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[1., 1., 1., 1.],\n", - " [1., 1., 1., 1.],\n", - " [1., 1., 1., 1.]],\n", - "\n", - " [[1., 1., 1., 1.],\n", - " [1., 1., 1., 1.],\n", - " [1., 1., 1., 1.]]], dtype=float32)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.ones((2,3,4), dtype=np.float32)" - ] - }, - { - "cell_type": "markdown", - "id": "83ac9c3a", - "metadata": {}, - "source": [ - "如果已经有一个多维数组 `a`,我们想根据这个数组 `a` 的形状生成一个全为 1 的数组:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "d071c196", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.892517Z", - "iopub.status.busy": "2023-09-23T02:14:27.892248Z", - "iopub.status.idle": "2023-09-23T02:14:27.896955Z", - "shell.execute_reply": "2023-09-23T02:14:27.896149Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1., 1., 1., 1., 1.])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.ones_like(a)" - ] - }, - { - "cell_type": "markdown", - "id": "50aa7a97", - "metadata": {}, - "source": [ - "### zeros() 与 zeros_like()\n", - "\n", - "`np.zeros()` 与 `np.ones()` 类似。`np.zeros(shape)` 生成 `shape` 大小的、全为 0 的数组。" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "69d14970", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.900171Z", - "iopub.status.busy": "2023-09-23T02:14:27.899883Z", - "iopub.status.idle": "2023-09-23T02:14:27.904721Z", - "shell.execute_reply": "2023-09-23T02:14:27.904155Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[0., 0., 0., 0.],\n", - " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]],\n", - "\n", - " [[0., 0., 0., 0.],\n", - " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]])" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.zeros((2,3,4))" - ] - }, - { - "cell_type": "markdown", - "id": "97228004", - "metadata": {}, - "source": [ - "如果已经有一个多维数组 `a`,我们想根据这个数组 `a` 的形状生成一个全为 0 的数组:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "4cf851df", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.907821Z", - "iopub.status.busy": "2023-09-23T02:14:27.907567Z", - "iopub.status.idle": "2023-09-23T02:14:27.911745Z", - "shell.execute_reply": "2023-09-23T02:14:27.910973Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0., 0., 0., 0., 0.])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.zeros_like(a)" - ] - }, - { - "cell_type": "markdown", - "id": "1e1d83d4", - "metadata": {}, - "source": [ - "### full() 与 full_like()\n", - "\n", - "`np.full(shape,val)` 生成 `shape` 大小的、全为 `val` 的数组,即数组中每个元素值都是 `val`。" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "32182b95", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.914690Z", - "iopub.status.busy": "2023-09-23T02:14:27.914439Z", - "iopub.status.idle": "2023-09-23T02:14:27.919146Z", - "shell.execute_reply": "2023-09-23T02:14:27.918174Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[6, 6, 6, 6],\n", - " [6, 6, 6, 6],\n", - " [6, 6, 6, 6]],\n", - "\n", - " [[6, 6, 6, 6],\n", - " [6, 6, 6, 6],\n", - " [6, 6, 6, 6]]])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.full((2,3,4), 6)" - ] - }, - { - "cell_type": "markdown", - "id": "dbbcb0de", - "metadata": {}, - "source": [ - "根据数组 `a` 的形状生成一个数组,元素值全为 `val`。这里生成一个全为 6 的数组:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "eac91e51", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.922652Z", - "iopub.status.busy": "2023-09-23T02:14:27.922362Z", - "iopub.status.idle": "2023-09-23T02:14:27.926995Z", - "shell.execute_reply": "2023-09-23T02:14:27.926158Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([6., 6., 6., 6., 6.])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.full_like(a, 6)" - ] - }, - { - "cell_type": "markdown", - "id": "14c67afe", - "metadata": {}, - "source": [ - "### eye()\n", - "\n", - "`np.eye(n)` 创建一个 $n \\times n$ 单位矩阵,对角线为 1,其余为 0。" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "8ebe1377", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.930247Z", - "iopub.status.busy": "2023-09-23T02:14:27.929977Z", - "iopub.status.idle": "2023-09-23T02:14:27.934585Z", - "shell.execute_reply": "2023-09-23T02:14:27.933786Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1., 0., 0.],\n", - " [0., 1., 0.],\n", - " [0., 0., 1.]])" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.eye(3)" - ] - }, - { - "cell_type": "markdown", - "id": "d3f93f7f", - "metadata": {}, - "source": [ - "## 常用属性\n", - "\n", - "直接打印一个 `ndarray` 可以看到它的值、`dtype` 等属性。" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "33d477a9", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.938488Z", - "iopub.status.busy": "2023-09-23T02:14:27.938184Z", - "iopub.status.idle": "2023-09-23T02:14:27.943942Z", - "shell.execute_reply": "2023-09-23T02:14:27.942888Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 1, 1, 2, 3],\n", - " [ 4, 5, 6, 7],\n", - " [ 8, 9, 10, 11]])" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar = np.array([[1,1,2,3,],\n", - " [4,5,6,7],\n", - " [8,9,10,11]])\n", - "ar" - ] - }, - { - "cell_type": "markdown", - "id": "fa1f3aa4", - "metadata": {}, - "source": [ - "或者打印某些具体的属性。\n", - "\n", - "* ndim:多维数组的秩,或者说轴的数量,或者说数组有多少维度" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "7a848ead", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.948362Z", - "iopub.status.busy": "2023-09-23T02:14:27.948013Z", - "iopub.status.idle": "2023-09-23T02:14:27.953403Z", - "shell.execute_reply": "2023-09-23T02:14:27.952161Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar.ndim" - ] - }, - { - "cell_type": "markdown", - "id": "18a3d721", - "metadata": {}, - "source": [ - "* 数组的尺度" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "ef93dd8e", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.956946Z", - "iopub.status.busy": "2023-09-23T02:14:27.956651Z", - "iopub.status.idle": "2023-09-23T02:14:27.961200Z", - "shell.execute_reply": "2023-09-23T02:14:27.960462Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(3, 4)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar.shape" - ] - }, - { - "cell_type": "markdown", - "id": "c9f584c0", - "metadata": {}, - "source": [ - "* 数组中元素的个数" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "78c262b9", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.964884Z", - "iopub.status.busy": "2023-09-23T02:14:27.964593Z", - "iopub.status.idle": "2023-09-23T02:14:27.969349Z", - "shell.execute_reply": "2023-09-23T02:14:27.968302Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "12" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar.size" - ] - }, - { - "cell_type": "markdown", - "id": "531cc159", - "metadata": {}, - "source": [ - "* 元素的数据类型" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "158acc4e", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.973241Z", - "iopub.status.busy": "2023-09-23T02:14:27.972911Z", - "iopub.status.idle": "2023-09-23T02:14:27.977542Z", - "shell.execute_reply": "2023-09-23T02:14:27.976635Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "dtype('int64')" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar.dtype" - ] - }, - { - "cell_type": "markdown", - "id": "522aee3e", - "metadata": {}, - "source": [ - "* 每个元素的大小,以字节(Byte)为单位" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "691936aa", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.981341Z", - "iopub.status.busy": "2023-09-23T02:14:27.981040Z", - "iopub.status.idle": "2023-09-23T02:14:27.985605Z", - "shell.execute_reply": "2023-09-23T02:14:27.984741Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar.itemsize" - ] - }, - { - "cell_type": "markdown", - "id": "4d8cb0b8", - "metadata": {}, - "source": [ - "## 数组维度变换\n", - "\n", - "我们经常要对数据进行一些变换。\n", - "\n", - "### 不改变原数组\n", - "\n", - "* `reshape()` 函数\n", - "\n", - "`reshape(shape)` 函数,不改变数组的元素,根据 `shape` 形状,生成一个新的数组。" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "18aed250", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.989513Z", - "iopub.status.busy": "2023-09-23T02:14:27.989202Z", - "iopub.status.idle": "2023-09-23T02:14:27.994596Z", - "shell.execute_reply": "2023-09-23T02:14:27.993663Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 1, 1, 2, 3, 4, 5],\n", - " [ 6, 7, 8, 9, 10, 11]])" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar.reshape((2,6))" - ] - }, - { - "cell_type": "markdown", - "id": "78ad865e", - "metadata": {}, - "source": [ - "* `flatten()` 函数\n", - "\n", - "`flatten()` 函数,对数组进行降维,将高维数组压缩成一个一维数组。" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "f5ada6b6", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:27.998079Z", - "iopub.status.busy": "2023-09-23T02:14:27.997712Z", - "iopub.status.idle": "2023-09-23T02:14:28.001832Z", - "shell.execute_reply": "2023-09-23T02:14:28.001301Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar.flatten()" - ] - }, - { - "cell_type": "markdown", - "id": "fcb5795b", - "metadata": {}, - "source": [ - "### 改变原数组\n", - "\n", - "* `resize()` 函数\n", - "\n", - "`resize(shape)` 函数,返回一个 `shape` 形状的数组,功能与 `reshape()` 函数一致,但是修改原数组。\n", - "\n", - ":::{note}\n", - "当新数组可容纳数据少于原数据,按照原数据选择前 `shape` 个数据;如果多于,则新数组会按照原数组中的数据顺序进行填补。\n", - ":::" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "788ebdbe", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:28.005308Z", - "iopub.status.busy": "2023-09-23T02:14:28.005017Z", - "iopub.status.idle": "2023-09-23T02:14:28.009168Z", - "shell.execute_reply": "2023-09-23T02:14:28.008630Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1, 1, 2, 3, 4],\n", - " [5, 6, 7, 8, 9]])" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar_new = np.resize(ar, (2, 5))\n", - "ar_new" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "e9dd6176", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:28.012388Z", - "iopub.status.busy": "2023-09-23T02:14:28.012091Z", - "iopub.status.idle": "2023-09-23T02:14:28.016319Z", - "shell.execute_reply": "2023-09-23T02:14:28.015807Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 1, 1, 2, 3, 4],\n", - " [ 5, 6, 7, 8, 9],\n", - " [10, 11, 1, 1, 2]])" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar_new = np.resize(ar, (3, 5))\n", - "ar_new" - ] - }, - { - "cell_type": "markdown", - "id": "649fda2e", - "metadata": {}, - "source": [ - "## 数据类型变换\n", - "\n", - "### `astype()`\n", - "\n", - "`astype(new_type)` 函数,对数组的数据类型进行类型变化,基于对原始数据的拷贝创建一个新的数组。比如,将 `np.int` 类型元素修改为 `np.float64` 类型:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "6a7ae15f", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:28.019548Z", - "iopub.status.busy": "2023-09-23T02:14:28.019240Z", - "iopub.status.idle": "2023-09-23T02:14:28.023657Z", - "shell.execute_reply": "2023-09-23T02:14:28.023140Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 1., 1., 2., 3.],\n", - " [ 4., 5., 6., 7.],\n", - " [ 8., 9., 10., 11.]])" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new_ar = ar.astype(np.float64)\n", - "new_ar" - ] - }, - { - "cell_type": "markdown", - "id": "40d612d0", - "metadata": {}, - "source": [ - "## 合并函数\n", - "\n", - "`np.concatenate()` 将两个或者多个数组合并成一个新数组。" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "d01912a7", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:28.026765Z", - "iopub.status.busy": "2023-09-23T02:14:28.026505Z", - "iopub.status.idle": "2023-09-23T02:14:28.031406Z", - "shell.execute_reply": "2023-09-23T02:14:28.030848Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1. , 2. , 3. , 4. , 5. ,\n", - " 1. , 2.33333333, 3.66666667, 5. , 6.33333333,\n", - " 7.66666667, 9. ])" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "b = np.linspace(1,9,7)\n", - "\n", - "c = np.concatenate((a,b)) #将 a,b 两个数组合并成为 c\n", - "c" - ] - }, - { - "cell_type": "markdown", - "id": "e04e0e80", - "metadata": {}, - "source": [ - "## `ndarray` 与 Python 列表的转换\n", - "\n", - "列表作为 Python 中原始的数据类型,运算速度慢于 NumPy。如果需要与原生 Python 语言相适配,需做转换:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "686db530", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-23T02:14:28.034595Z", - "iopub.status.busy": "2023-09-23T02:14:28.034319Z", - "iopub.status.idle": "2023-09-23T02:14:28.038710Z", - "shell.execute_reply": "2023-09-23T02:14:28.038102Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[[1, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ar.tolist()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/_sources/ch-numpy/numpy-intro.ipynb b/docs/_sources/ch-numpy/numpy-intro.ipynb deleted file mode 100644 index 5a43345b..00000000 --- a/docs/_sources/ch-numpy/numpy-intro.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells":[{"cell_type":"markdown","metadata":{},"source":["# NumPy 简介\n","\n","Python 语言其实并不是为科学计算而设计的,到了 2000 年左右,Python 在科学计算领域变得越来越受欢迎,但缺乏一个高效的数组处理工具。Python 的列表(list)虽然灵活,但在处理大型数据集时性能不佳。\n","\n","NumPy 并不是第一个 Python 科学计算库,它的前身有 Numeric、Numarray 等,并借鉴 Fortran、MATLAB、和 S 语言了优点。经过了一系列的演化发展,Travis Oliphant 在 2005 年创建了 NumPy 项目,并在 2006 年发布了 NumPy 1.0。NumPy 的目标是提供高性能的多维数组对象,以及用于数组操作的丰富函数和方法。\n","\n","自从 NumPy 项目创建以来,它已经成为 Python 科学计算生态系统中的核心组件。许多其他科学计算和数据分析库,如 SciPy、pandas 和 Matplotlib,都构建在 NumPy 的基础之上。"]},{"cell_type":"markdown","metadata":{},"source":["## 为什么要使用 NumPy\n","\n","NumPy 引入了 `ndarray` 这一核心数据结构,NumPy 的 `ndarray` 比 Python 的列表(list)更快速、更紧凑,数据占用内存少,使用更方便。"]},{"cell_type":"markdown","metadata":{},"source":["## 安装 NumPy\n","\n","可以使用 `conda` 或者 `pip` 安装:\n","\n","```bash\n","pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple\n","```"]}],"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.10.11"}},"nbformat":4,"nbformat_minor":2} diff --git a/docs/_sources/ch-numpy/random.ipynb b/docs/_sources/ch-numpy/random.ipynb deleted file mode 100644 index 36619169..00000000 --- a/docs/_sources/ch-numpy/random.ipynb +++ /dev/null @@ -1,1316 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 随机数生成\n", - "\n", - "`numpy.random` 模块用于生成随机数。" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 随机数生成器:Random Generator\n", - "\n", - "最新版本的 NumPy 使用 Random Generator 生成随机数,它可以生成各种分布(Distribution)。在 Random Generator API 之前,NumPy 还有一个较老版本随机数生成器 API,又被成为 Random State API。我们先介绍基于 Random Generator 的 API。\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "生成随机数之前需要先要创建一个随机数生成器,`default_rng(seed=None)` 是 Random Generator API 所推荐的构造函数。" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "rng = np.random.default_rng() " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "我们基于 `default_rng()` 生成浮点型随机数:" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.22733602246716966" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng = np.random.default_rng(12345)\n", - "\n", - "rfloat = rng.random()\n", - "rfloat" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "查看 `rfloat` 的数据类型。" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "float" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(rfloat)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "接下来,我们用 `default_rng` 函数生成 3 个范围在 `[0,10)` 内的随机数。" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([6, 2, 7])" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "rng = np.random.default_rng(12345)\n", - "rints = rng.integers(low=0, high=10, size=3)\n", - "rints" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "查看 `rints` 的数据类型。" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "numpy.int64" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(rints[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 随机数种子\n", - "\n", - "在计算机中,生成随机数通常是通过一个算法来实现,具体而言是实现一个伪随机数生成器,该生成器根据一个名为种子(Seed)的数值来生成一个随机数序列。随机数种子相当于是一个起始的引子,使用同样的种子会生成同样的随机数序列。因此种子值在生成随机数时起到了确定性的作用。随机数种子通常是一个整数,可以是任意值。在使用随机数生成器时,可以通过指定种子值来控制生成的随机数序列。如果不指定种子值,则通常会使用系统时间作为默认的种子值,以确保每次生成的随机数序列都是不同的。随机数种子在很多应用中都很重要,尤其是在需要重现随机结果的情况下。通过使用相同的种子值,可以确保在不同的计算机上生成的随机数序列是一致的。\n", - "\n", - "需要注意的是,由于计算机生成的随机数是基于算法的伪随机数,因此种子值的选择也会影响到生成的随机数的质量。较好的做法是选择一个高熵的种子值,以提高随机数的质量和安全性。\n", - "\n", - "在 Random Generator API 中,随机数种子用 `np.random.default_rng(seed=s)` 方法来设置,`s` 是用户传入的种子值。\n", - "\n", - "下面的例子中,我们设置随机种子为 42 ,使用 `random()` 方法在 `[0,1)` 范围内随机生成结构为 $2 \\times 3 \\times 4$ 的整数数组。因为我们设置了随机种子,每次运行下方随机数生成代码生成的随机数均相同。" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[0.77395605, 0.43887844, 0.85859792, 0.69736803],\n", - " [0.09417735, 0.97562235, 0.7611397 , 0.78606431],\n", - " [0.12811363, 0.45038594, 0.37079802, 0.92676499]],\n", - "\n", - " [[0.64386512, 0.82276161, 0.4434142 , 0.22723872],\n", - " [0.55458479, 0.06381726, 0.82763117, 0.6316644 ],\n", - " [0.75808774, 0.35452597, 0.97069802, 0.89312112]]])" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng = np.random.default_rng(seed=42)\n", - "arr1 = rng.random((2, 3, 4))\n", - "arr1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "当我们退出 Python 编辑器后并重新启动,我们会发现在设置随机种子为 42 时,我们会得到同样的随机数。" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[0.77395605, 0.43887844, 0.85859792, 0.69736803],\n", - " [0.09417735, 0.97562235, 0.7611397 , 0.78606431],\n", - " [0.12811363, 0.45038594, 0.37079802, 0.92676499]],\n", - "\n", - " [[0.64386512, 0.82276161, 0.4434142 , 0.22723872],\n", - " [0.55458479, 0.06381726, 0.82763117, 0.6316644 ],\n", - " [0.75808774, 0.35452597, 0.97069802, 0.89312112]]])" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng = np.random.default_rng(seed=42)\n", - "arr2 = rng.random((2, 3, 4))\n", - "arr2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - ":::{note}\n", - "\n", - "很多网络上的示例代码经常使用 42 作为随机种子值,这其实是一个约定俗成的习惯,但并不是出于任何特殊原因或技术要求。实际上,选择随机种子值是主观的,可以是任何整数。使用 42 作为随机种子值主要由于以下原因:\n", - "\n", - "1. 42 是一个著名的数字:在计算机科学和科幻文化中,数字 42 具有一定的象征意义。在道格拉斯 · 亚当斯的小说《银河系漫游指南》中,超级电脑 “深思照片” 认为生命、宇宙以及一切的答案是 42。因此,一些程序员选择 42 作为随机种子值,是一种幽默或致敬。\n", - "\n", - "2. 方便记忆:42 是一个简单的数字,使用它作为随机种子值可以更容易地记住和重现特定的随机数序列。\n", - "\n", - "值得注意的是,使用 42 作为随机种子值并不会使随机数序列更加随机或具有更高的质量。在实际应用中,选择随机种子值时应根据具体需求和安全性要求进行评估和选择。\n", - ":::" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 随机数生成\n", - "\n", - "### 整数\n", - "\n", - "如果想要生成随机整数,可以使用函数 `integers(low, high=None, size=None, dtype=np.int64, endpoint=False)` ,数值范围为 $[low,high)$。\n", - "若 `endpoint=True` ,则数值范围改变为 $[low,high]$。\n", - "若 `high=None` (默认值),则数值范围为 $[0,low]$。\n", - "\n", - "`integers()` 函数可以从指定数据类型的 “离散均匀” 分布中返回随机整数。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "下面的例子,我们在 `[0,2)` 随机生成 10 个随机整数。" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1, 1, 0, 0, 1, 0, 0, 0, 0, 0])" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng = np.random.default_rng()\n", - "rng.integers(low=2, high=None, size=10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "接下来,我们在 `[0,5)` 随机生成结构为 $2 \\times 3 \\times 4$ 的整数数组。" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[4, 4, 2, 3],\n", - " [0, 3, 3, 3],\n", - " [1, 3, 2, 0]],\n", - "\n", - " [[4, 1, 4, 3],\n", - " [0, 1, 4, 2],\n", - " [0, 4, 2, 2]]])" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng.integers(low=5, high=None, size=(2, 3, 4))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "使用 `integers()` 函数,我们可以同时生成几个具有不同上限(或下限)的随机整数。\n", - "例如,在下面的例子里,我们生成三组整数:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "在三个不同上限, `[1,3)` 、 `[1,5)` 、 `[1,1)` ,随机生成结构为 $1 \\times 3$ 的整数数组 `arr1` 。" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1, 1, 5])" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = rng.integers(1, [3, 5, 10])\n", - "arr1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "在三个不同下限, `[1,10)` 、 `[3,10)` 、 `[5,10)` ,随机生成结构为 $1 \\times 3$ 的整数数组 `arr2` 。" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([6, 6, 6])" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr2 = rng.integers([1, 3, 5], 10)\n", - "arr2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "随机生成结构为 $2 \\times 4$ 的整数数组 `arr3` 。" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 7, 7, 6, 7],\n", - " [10, 4, 19, 8]])" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr3 = rng.integers([1, 3, 5, 7], [[10],[20]])\n", - "arr3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 浮点数\n", - "\n", - "如果想要生成浮点型随机数,可以使用函数 `random(size=None, dtype=np.float64, out=None)` ,数值范围为 $[0.0, 1.0)$。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "下面的例子,我们生成数值范围为 $[0.0, 1.0)$ 的浮点型随机数。" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "rng = np.random.default_rng()\n", - "rfloat = rng.random()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "查看 `rfloat` 的数值类型。" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "float" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(rfloat)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "随机生成维度为 $2 \\times 2 \\times 3$ 的数组,服从 `[0,1)` 均匀分布。" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[0.69043733, 0.37606242, 0.65940416],\n", - " [0.5136057 , 0.49864869, 0.19782748]],\n", - "\n", - " [[0.730943 , 0.92909854, 0.77622959],\n", - " [0.56590965, 0.78527898, 0.75840335]]])" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng.random((2, 2, 3))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "对于 `[a,b)`的样本,若想要随机生成来自指定间隔内的“连续均匀”分布,可以使用 `uniform()` 函数或将 `random()` 的输出乘以 `(b - a)` 并添加 `a` :`(b - a) * random() + a` " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "下面的例子,我们在 `[-5,0)` 随机生成结构为 $3 \\times 2$ 的整数数组。 " - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[-3.63168381, -3.66462336],\n", - " [-3.794256 , -1.53588542],\n", - " [-2.49770707, -1.80248065]])" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "5 * rng.random((3, 2)) - 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 排列\n", - "\n", - "一个典型的随机数场景是生成排列组合。 \n", - "\n", - "`shuffle(x[, axis])` 方法就像扑克牌中的洗牌,可以在原地打乱对象 `x` 。如果 `x` 是多维数组,则按照第一维“洗牌”。现在,我们在 $[100,400)$ 范围内生成随机整数数组,并将生成的矩阵按照行“洗牌”。" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "===before shuffle===\n", - "[[377 219]\n", - " [337 180]\n", - " [169 315]]\n", - "===after shuffle===\n", - "[[337 180]\n", - " [169 315]\n", - " [377 219]]\n" - ] - } - ], - "source": [ - "x = rng.integers(100, 400, size=(3, 2))\n", - "print(\"===before shuffle===\")\n", - "print(x)\n", - "rng.shuffle(x)\n", - "print(\"===after shuffle===\")\n", - "print(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`permutation(x[, axis])` 方法生成了某种可能的排列。如果 `x` 是多维数组,则按照第一维生成一种新的排列。" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([6, 2, 1, 4, 9, 7, 3, 8, 0, 5])" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng.permutation(10)" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 9, 4, 12, 1, 15])" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng.permutation([1, 4, 9, 12, 15])" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[269, 334],\n", - " [321, 146],\n", - " [316, 248]])" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = rng.integers(100, 400, size=(3, 2))\n", - "rng.permutation(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`permuted(x[, axis, out]` 方法可以随机生成沿着轴 `axis` 随机排列 `x` 。\n", - "与 `shuffle(x)` 不同,给定轴上的每个切片都独立于其他切片进行 “洗牌”。\n", - "\n", - "`axis` 是需要进行洗牌的轴。每个切片独立于其他切片进行洗牌。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "下面的例子,我们首先生成一个测试数组 `x`:" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 2, 11, 0, 10, 12],\n", - " [ 9, 0, 0, 14, 4],\n", - " [14, 11, 13, 2, 10]])" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = rng.integers(15, size=(3, 5))\n", - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "沿行打乱 `x` :" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 2, 11, 0, 12, 10],\n", - " [ 0, 0, 9, 4, 14],\n", - " [ 2, 10, 11, 13, 14]])" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y = rng.permuted(x, axis=1)\n", - "y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "沿列打乱 `x` :" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[14, 0, 0, 10, 4],\n", - " [ 9, 11, 0, 2, 12],\n", - " [ 2, 11, 13, 14, 10]])" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "z = rng.permuted(x, axis=0)\n", - "z" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "查看 `x` ,发现 `x` 没有被更改:" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 2, 11, 0, 10, 12],\n", - " [ 9, 0, 0, 14, 4],\n", - " [14, 11, 13, 2, 10]])" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "若要“就地”移动x的行,即改变 `x` 本身,我们需要将 `x` 作为 `out` 参数设置。注意,当给定 `out` 参数时,返回值是 `out` 。" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 2, 11, 0, 10, 12],\n", - " [ 0, 0, 14, 9, 4],\n", - " [ 2, 14, 13, 11, 10]])" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y = rng.permuted(x, axis=1, out=x)\n", - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "现在验证原测试数组 `x` ,与返回值 `y` 是否一致,即 `x` 是否“就地”按行打乱。" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y is x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 分布\n", - "`numpy.random` 模块中提供了生成概率分布的函数。\n", - "\n", - "### 离散型随机变量\n", - "\n", - "#### 二项分布\n", - "\n", - "`binomial(n, p, size=None)` 从二项分布中抽取样本。参数包括:\n", - "`n` (试验次数,数值范围为 $[0,+∞)$); `p` (成功概率,数值范围为 $[0,1]$); `size` (输出的形状)。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "从分布中抽取样本:" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [], - "source": [ - "rng = np.random.default_rng()\n", - "n, p = 10, .5 \n", - "s = rng.binomial(n, p, 1000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "下面我们来进行一个真实的例子,一家公司钻了 9 口石油勘探井,每口井的成功概率估计为 0.1。\n", - "九口井全部失败。发生这种情况的可能性有多大? 让我们对该模型进行 20,000 次试验,并计算发生上述情况的概率。" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.38945" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sum(rng.binomial(9, 0.1, 20000) == 0)/20000" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "#### 泊松分布\n", - "\n", - "`poisson(lam=1.0, size=None)` 从泊松分布中抽取样本。 \n", - "泊松分布是二项分布对于大N的极限。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "从分布中抽取样本:" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([6, 4, 4, ..., 4, 1, 5])" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng = np.random.default_rng()\n", - "s = rng.poisson(5, 10000)\n", - "s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 超几何分布\n", - "\n", - "`hypergeometric(ngood, nbad, nsample, size=None)` 函数从超几何分布中抽取样本。 它的参数包括:\n", - "`ngood` (做出好的选择的方法数量), `nbad` (做出坏的选择的方法数量)和 `nsample` (采样的项目数,小于或等于ngood + nbad之和),`size` (输出的形状)。以上参数均非负。" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 9, 10, 9, 10,\n", - " 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 9, 9, 10, 9, 10,\n", - " 10, 9, 10, 10, 10, 10, 9, 10, 10, 10, 9, 9, 10, 9, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 9, 9,\n", - " 10, 10, 10, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10,\n", - " 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 10, 9, 10, 10, 10, 9, 10,\n", - " 9, 10, 9, 10, 10, 9, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10,\n", - " 10, 10, 9, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 9,\n", - " 10, 10, 9, 10, 10, 9, 10, 9, 9, 10, 10, 10, 10, 10, 10, 9, 10,\n", - " 10, 9, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10,\n", - " 9, 9, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 9, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9,\n", - " 10, 10, 10, 10, 9, 9, 10, 10, 10, 9, 10, 10, 9, 10, 10, 10, 10,\n", - " 9, 10, 9, 10, 10, 10, 10, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 9, 9, 10, 9, 10, 10, 10, 10, 10, 10, 9, 10, 10, 9, 10, 9, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 10, 10, 9, 9, 10,\n", - " 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 9, 10, 8,\n", - " 9, 10, 10, 10, 10, 10, 10, 10, 9, 9, 10, 10, 10, 10, 10, 10, 9,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10,\n", - " 9, 10, 10, 10, 10, 10, 10, 10, 9, 10, 9, 10, 10, 10, 10, 10, 10,\n", - " 10, 10, 9, 10, 10, 10, 10, 10, 10, 9, 10, 9, 10, 10, 9, 10, 10,\n", - " 8, 10, 10, 10, 10, 10, 9, 10, 10, 9, 10, 9, 10, 9, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 9, 10, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10,\n", - " 10, 9, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 10, 10, 10, 9, 10, 10, 10, 10, 9, 9, 9, 9, 10, 9, 10, 9, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 9, 9, 9,\n", - " 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 9, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 10, 10, 8, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 9, 9, 10,\n", - " 10, 10, 10, 10, 10, 9, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 10, 10, 9, 10, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 8, 10, 10, 10, 10, 10,\n", - " 9, 10, 10, 10, 9, 10, 9, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10,\n", - " 9, 10, 10, 9, 10, 10, 10, 9, 10, 9, 9, 10, 10, 10, 9, 10, 9,\n", - " 10, 10, 10, 9, 8, 9, 10, 8, 10, 10, 10, 9, 8, 10, 10, 10, 9,\n", - " 10, 9, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 10, 10, 9, 10, 10, 10, 8, 10, 10, 10, 10, 9, 10, 9, 10, 9, 10,\n", - " 10, 10, 9, 10, 10, 10, 10, 9, 9, 10, 10, 10, 10, 10, 9, 10, 9,\n", - " 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10,\n", - " 9, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 9, 10, 9, 10, 9, 10,\n", - " 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 9, 9, 10,\n", - " 10, 10, 9, 8, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 9, 8, 10,\n", - " 9, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 10, 10, 9, 10, 10, 9, 10, 10, 9, 9, 10, 9, 10, 10, 9, 10, 10,\n", - " 10, 9, 10, 10, 8, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10,\n", - " 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n", - " 10, 9, 10, 10, 10, 9, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10,\n", - " 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 10, 10, 10, 10, 10,\n", - " 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 10, 10])" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng = np.random.default_rng()\n", - "ngood, nbad, nsamp = 100, 2, 10\n", - "s = rng.hypergeometric(ngood, nbad, nsamp, 1000)\n", - "s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "例如,假设你有一个装有15颗白色弹珠和15颗黑色小球的弹珠。如果你随机抽取15颗弹珠,其中12颗或更多是一种颜色的可能性有多大?" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.00281" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s = rng.hypergeometric(15, 15, 15, 100000)\n", - "sum(s>=12)/100000. + sum(s<=3)/100000 " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 连续性随机变量\n", - "\n", - "#### 均匀分布\n", - "\n", - "`uniform(low, high, size)` 从均匀分布中抽取样本。它的参数包括:\n", - "`low` (输出间隔的下限,默认值为 0。);`high` (输出间隔的上限,默认值为 1。);`size` (输出的形状)。\n", - "\n", - "#### 正态分布\n", - "\n", - "`normal(loc, scale, size)` 函数从正态(高斯)分布中抽取随机样本。 它的参数包括:\n", - "`loc` (分布的平均值,默认值为 0。);`scale` (分布的标准差,必须非负,默认值为 1。);`size` (输出的形状)。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "下面我们从分布中抽取样本:" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [], - "source": [ - "np.random.default_rng()\n", - "s = rng.uniform(-1, 0, 1000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "接下来,我们随机生成一个正态分布的样本的 $2 \\times 4$ 序列,平均值为 3 ,标准差为 2.5 :" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 0.19398645, -0.37285486, 2.20269266, 1.45086765],\n", - " [-1.61830281, 3.02871741, -2.48018529, 4.03935919]])" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rng.normal(3, 2.5, size=(2, 4))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 指数分布\n", - "\n", - "`exponential(scale, size)` 函数从指数分布中抽取样本。\n", - "参数包括:\n", - "`scale` (比例参数,必须非负,默认值为 1。);`size` (输出的形状)。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "下面我们从分布中抽取样本:" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [], - "source": [ - "s = rng.exponential(3, 1000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "接下来我们来解决一道数学应用题目:\n", - "假设一家公司有10000个客户支持代理,客户呼叫之间的平均时间是4分钟,客户在接下来的4到5分钟内打电话的概率有多大?" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.08100000000000007" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "n = 10000\n", - "time_between_calls = rng.exponential(scale=4, size=n) #题目告知参数设置\n", - "x = ((time_between_calls < 5).sum())/n #客户在5分钟内打电话的概率\n", - "y = ((time_between_calls < 4).sum())/n #客户在4分钟内打电话的概率\n", - "x - y #得到客户在4到5分钟内打电话的概率" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 老版本随机数 API\n", - "\n", - "上面介绍了 NumPy 最新的随机数 API,较老的 API 没有随机数生成器和 `default_rng()` 方法。较老版本的随机数 API 又被成为 RandomState API。\n", - "\n", - "### 均匀分布\n", - "\n", - "在 RandomState API 中,函数 `rand(d0, d1, ..., dn)` 是使用最多的随机数生成方法,其中 $d_0 \\sim d_n$ 用来设置数组的维度,最终生成一个 `[0,1)` 之间的 N 维浮点数组。\n", - "\n", - "例如,随机生成维度为 $2 \\times 2 \\times 3$ 的数组,服从 `[0,1)` 均匀分布。" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[0.7889164 , 0.15195504, 0.18090323],\n", - " [0.9160419 , 0.66120841, 0.71033731]],\n", - "\n", - " [[0.62115291, 0.38081007, 0.04188282],\n", - " [0.30355158, 0.11264447, 0.8451043 ]]])" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.random.rand(2, 2, 3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 正态分布\n", - "\n", - "`randn(d0, d1, ..., dn)` 方法生成的浮点数服从标准正态分布。\n", - "\n", - "例如,随机生成维度为 $2 \\times 2 \\times 3$ 的数组,服从标准正态分布。" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[-0.69116487, -0.71304809, 1.17545016],\n", - " [ 2.94471983, 0.27195741, -0.40955671]],\n", - "\n", - " [[-0.46384838, 0.14182464, -1.18426511],\n", - " [ 0.54771799, 0.30882418, 1.34024231]]])" - ] - }, - "execution_count": 76, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.random.randn(2, 2, 3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 数值范围\n", - "\n", - "如果想设置随机数生成的数值范围,可以使用 `randint(low, high, size)`,数值范围为 $[low,high)$。" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[336, 329, 345, 381],\n", - " [204, 170, 303, 253],\n", - " [381, 350, 237, 207]],\n", - "\n", - " [[377, 376, 128, 185],\n", - " [336, 101, 219, 373],\n", - " [278, 362, 336, 166]]])" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.random.randint(low=100, high=400, size=(2,3,4))" - ] - } - ], - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_sources/ch-pandas/data-preprocessing.ipynb b/docs/_sources/ch-pandas/data-preprocessing.ipynb deleted file mode 100644 index d102c8c5..00000000 --- a/docs/_sources/ch-pandas/data-preprocessing.ipynb +++ /dev/null @@ -1,3449 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "11346fad", - "metadata": {}, - "source": [ - "# 数据处理\n", - "\n", - "数据处理工作包括处理重复值、缺失值和异常值,生成新的列或者行等。" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "fa7d53ff", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:36.287650Z", - "iopub.status.busy": "2023-09-11T14:28:36.287206Z", - "iopub.status.idle": "2023-09-11T14:28:36.942807Z", - "shell.execute_reply": "2023-09-11T14:28:36.941596Z" - }, - "tags": [ - "hide code", - "hide-cell" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "文件夹已存在,无需操作。\n" - ] - } - ], - "source": [ - "import os\n", - "import urllib.request\n", - "import zipfile\n", - "import pandas as pd\n", - "\n", - "folder_path = os.path.join(os.getcwd(), \"../data/pwt\")\n", - "download_url = \"https://www.rug.nl/ggdc/docs/pwt70_06032011version.zip\"\n", - "file_name = download_url.split(\"/\")[-1]\n", - "if not os.path.exists(folder_path):\n", - " # 创建文件夹\n", - " os.makedirs(folder_path)\n", - " print(f\"文件夹不存在,已创建。\")\n", - "\n", - " zip_file_path = os.path.join(folder_path, file_name)\n", - "\n", - " urllib.request.urlretrieve(download_url, zip_file_path)\n", - " with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:\n", - " zip_ref.extractall(folder_path)\n", - " print(\"数据已下载并解压缩。\")\n", - "else:\n", - " print(f\"文件夹已存在,无需操作。\")\n", - "\n", - "df = pd.read_csv(os.path.join(folder_path, \"pwt70_w_country_names.csv\"))" - ] - }, - { - "cell_type": "markdown", - "id": "78c3acf0", - "metadata": {}, - "source": [ - "## 处理重复值\n", - "\n", - "检测数据集的记录是否存在重复,可以使用 `.duplicated()` 函数进行验证,但是该函数返回的是数据集每一行的检测结果,即 n 行数据会返回 n 个布尔值。为了能够得到最直接的结果,可以使用 `any` 函数。该函数表示的是在多个条件判断中,只要有一个条件为 True,则 `any` 返回的结果为 True。" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "a94326d2", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:36.997529Z", - "iopub.status.busy": "2023-09-11T14:28:36.996959Z", - "iopub.status.idle": "2023-09-11T14:28:37.040339Z", - "shell.execute_reply": "2023-09-11T14:28:37.039298Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "any(df.duplicated())" - ] - }, - { - "cell_type": "markdown", - "id": "610f3c20", - "metadata": {}, - "source": [ - "如果有重复项,可以通过 `.drop_duplicated()` 删除。该函数有 `inplace` 参数,设置为 True 表示直接在原始数据集上做操作:`df.drop_duplicated(inplace = True)`。\n", - "\n", - "## 处理缺失值\n", - "\n", - "缺失值是指数据集中的某些观测存在遗漏。数据缺失可能有两方面原因:一方面是人为原因,如记录过程中的遗漏、个人隐私而不愿意透露等;另一方面是机器或设备的故障所导致。\n", - "\n", - "可以使用 `.isna()` 或 `.isnull()` 函数查看缺失值。这两个函数返回 `DataFrame` 每个元素是否有缺失值,如果有缺失值,比如 N/A 或`null`,则返回 True;否则返回 False。\n", - "\n", - "例如:通过 `.sum()` 查看每一列的空缺值计数。" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "1869154f", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:37.044426Z", - "iopub.status.busy": "2023-09-11T14:28:37.044091Z", - "iopub.status.idle": "2023-09-11T14:28:37.054797Z", - "shell.execute_reply": "2023-09-11T14:28:37.054096Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "country 0\n", - "isocode 0\n", - "year 0\n", - "POP 2\n", - "XRAT 1237\n", - "Currency_Unit 1237\n", - "ppp 2655\n", - "tcgdp 2655\n", - "cgdp 2655\n", - "cgdp2 2655\n", - "cda2 2655\n", - "cc 2655\n", - "cg 2655\n", - "ci 2655\n", - "p 2655\n", - "p2 2655\n", - "pc 2655\n", - "pg 2655\n", - "pi 2655\n", - "openc 2655\n", - "cgnp 3095\n", - "y 2655\n", - "y2 2655\n", - "rgdpl 2675\n", - "rgdpl2 2675\n", - "rgdpch 2675\n", - "kc 2675\n", - "kg 2675\n", - "ki 2675\n", - "openk 2675\n", - "rgdpeqa 2845\n", - "rgdpwok 3223\n", - "rgdpl2wok 3223\n", - "rgdpl2pe 10555\n", - "rgdpl2te 6001\n", - "rgdpl2th 9126\n", - "rgdptt 2655\n", - "dtype: int64" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.isnull().sum()" - ] - }, - { - "cell_type": "markdown", - "id": "0a57b958", - "metadata": {}, - "source": [ - "一般而言,遇到缺失值时,可以采用三种方法处理,分别是删除法、替换法或插补法。\n", - "\n", - "删除法是指当缺失的观测比例非常低(如 5% 以内),直接删除存在缺失的观测,或者当某些变量的缺失比例非常高时(如 85% 以上),直接删除这些缺失的变量。\n", - " \n", - "可以使用 `.dropna()` 函数删除有缺失值的行或列。具体形式:`df.dropna(axis=0, how='any', inplace=False)`。\n", - "\n", - "这个函数有参数 `axis`,`axis` 用来指定要删除的轴。`axis=0` 表示删除行(默认),`axis=1` 表示删除列。`how` 用来指定删除的条件。`how='any'` 表示删除包含任何缺失值的行(默认),`how='all'` 表示只删除所有值都是缺失值的行。`inplace` 用于指定是否在原始 `DataFrame` 上进行修改,默认为 False,表示不修改原始 `DataFrame`,而是返回一个新的 `DataFrame`。\n", - "\n", - "例如,删除包含任何缺失值的行。" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "0b394a35", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:37.058589Z", - "iopub.status.busy": "2023-09-11T14:28:37.058299Z", - "iopub.status.idle": "2023-09-11T14:28:37.066199Z", - "shell.execute_reply": "2023-09-11T14:28:37.065543Z" - } - }, - "outputs": [], - "source": [ - "ddf = df.dropna()" - ] - }, - { - "cell_type": "markdown", - "id": "f7813fbb", - "metadata": {}, - "source": [ - "`.fillna()` 函数填补数据框中的缺失值。例如,将 `DataFrame` 中的缺失值用 0 填充。" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "24a55941", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:37.069545Z", - "iopub.status.busy": "2023-09-11T14:28:37.069236Z", - "iopub.status.idle": "2023-09-11T14:28:37.078714Z", - "shell.execute_reply": "2023-09-11T14:28:37.078005Z" - } - }, - "outputs": [], - "source": [ - "fill_zero_df = df.fillna(0)" - ] - }, - { - "cell_type": "markdown", - "id": "541a8cbd", - "metadata": {}, - "source": [ - "对于时间类型的数据集,可以用 `.fillna()` 的 `method` 参数,可以接受 `ffill` 和 `bfill` 两种值,分别代表前向填充和后向填充,使得数据前后具有连贯性,而一般的独立性样本并不适用该函数。(前向填充是指用缺失值的前一个值替换,而后向填充是指用缺失值的后一个值替换。)\n", - "\n", - "## Apply 函数\n", - "\n", - "`.apply()` 函数也是一个 pandas 中常用的函数。它可以对每行 / 列(也可以对基于切片选择特定的列或行)应用一个函数并返回一个 `Series`。该函数可以是一些内置函数,如 max 函数、lambda 函数或自定义函数。\n", - "\n", - "- max 函数\n", - "\n", - "例如,返回 `year`, `POP`, `XRAT`, `tcgdp`, `cc`, `cg` 列的最大值(当该列有空值时,无法计算最大值,则返回空值)。" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "d4918ae8", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:37.082242Z", - "iopub.status.busy": "2023-09-11T14:28:37.081924Z", - "iopub.status.idle": "2023-09-11T14:28:37.093991Z", - "shell.execute_reply": "2023-09-11T14:28:37.093128Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "year 2009.0\n", - "POP 1323592.0\n", - "XRAT NaN\n", - "tcgdp NaN\n", - "cc NaN\n", - "cg NaN\n", - "dtype: float64" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[['year', 'POP', 'XRAT', 'tcgdp', 'cc', 'cg']].apply(max)" - ] - }, - { - "cell_type": "markdown", - "id": "479da63f", - "metadata": {}, - "source": [ - "- lambda 函数,形式为 `lambda arguments: expression`\n", - "\n", - "lambda 函数是一种没有函数名,但是可以被调用执行的函数。换句话说,lambda 函数不需要用 `def func_name()` 来定义函数名,而是直接定义函数体中的计算部分。关于函数体部分,`arguments` 是参数列表,可以指定一个或多个参数,就像定义普通函数一样;`expression` 是一个表达式,定义了 lambda 函数的计算逻辑,通常包括使用参数执行哪些计算,并返回计算结果。lambda 函数通常用于一次性的、简单的操作。\n", - "\n", - "例如,对每一行返回数据本身,不做任何其他操作:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "e06af0c2", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:37.097900Z", - "iopub.status.busy": "2023-09-11T14:28:37.097546Z", - "iopub.status.idle": "2023-09-11T14:28:37.670073Z", - "shell.execute_reply": "2023-09-11T14:28:37.669094Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
0AfghanistanAFG19508150.368NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1AfghanistanAFG19518284.473NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2AfghanistanAFG19528425.333NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3AfghanistanAFG19538573.217NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4AfghanistanAFG19548728.408NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
11395ZimbabweZWE200511639.4702.236364e+01Zimbabwe Dollar39.4828291968.205961169.097559184.183929...6.9957709.37627289.399427214.739197418.970867418.970867NaN390.907086NaN169.097559
11396ZimbabweZWE200611544.3261.643606e+02Zimbabwe Dollar384.8996512132.305773184.705956192.953943...7.64802014.98682381.697014217.543648424.754259407.262097NaN377.352394NaN179.368685
11397ZimbabweZWE200711443.1879.675781e+03Zimbabwe Dollar38583.3239602107.937100184.208918198.215361...8.38710615.78732284.483374202.707080396.486201376.163064NaN345.764991NaN173.113448
11398ZimbabweZWE200811350.0006.715424e+09Zimbabwe Dollar38723.9577401772.209867156.141839162.112294...7.68531213.44444985.117130174.178806343.159758332.649861NaN302.945712NaN142.329054
11399ZimbabweZWE200911383.0001.400000e+17Zimbabwe Dollar40289.9589901906.049843167.447056174.419700...7.90552514.74366783.749534182.613004NaNNaNNaN314.171069NaN151.435285
\n", - "

11400 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "0 Afghanistan AFG 1950 8150.368 NaN NaN \n", - "1 Afghanistan AFG 1951 8284.473 NaN NaN \n", - "2 Afghanistan AFG 1952 8425.333 NaN NaN \n", - "3 Afghanistan AFG 1953 8573.217 NaN NaN \n", - "4 Afghanistan AFG 1954 8728.408 NaN NaN \n", - "... ... ... ... ... ... ... \n", - "11395 Zimbabwe ZWE 2005 11639.470 2.236364e+01 Zimbabwe Dollar \n", - "11396 Zimbabwe ZWE 2006 11544.326 1.643606e+02 Zimbabwe Dollar \n", - "11397 Zimbabwe ZWE 2007 11443.187 9.675781e+03 Zimbabwe Dollar \n", - "11398 Zimbabwe ZWE 2008 11350.000 6.715424e+09 Zimbabwe Dollar \n", - "11399 Zimbabwe ZWE 2009 11383.000 1.400000e+17 Zimbabwe Dollar \n", - "\n", - " ppp tcgdp cgdp cgdp2 ... kg \\\n", - "0 NaN NaN NaN NaN ... NaN \n", - "1 NaN NaN NaN NaN ... NaN \n", - "2 NaN NaN NaN NaN ... NaN \n", - "3 NaN NaN NaN NaN ... NaN \n", - "4 NaN NaN NaN NaN ... NaN \n", - "... ... ... ... ... ... ... \n", - "11395 39.482829 1968.205961 169.097559 184.183929 ... 6.995770 \n", - "11396 384.899651 2132.305773 184.705956 192.953943 ... 7.648020 \n", - "11397 38583.323960 2107.937100 184.208918 198.215361 ... 8.387106 \n", - "11398 38723.957740 1772.209867 156.141839 162.112294 ... 7.685312 \n", - "11399 40289.958990 1906.049843 167.447056 174.419700 ... 7.905525 \n", - "\n", - " ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "0 NaN NaN NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN NaN NaN \n", - "2 NaN NaN NaN NaN NaN NaN \n", - "3 NaN NaN NaN NaN NaN NaN \n", - "4 NaN NaN NaN NaN NaN NaN \n", - "... ... ... ... ... ... ... \n", - "11395 9.376272 89.399427 214.739197 418.970867 418.970867 NaN \n", - "11396 14.986823 81.697014 217.543648 424.754259 407.262097 NaN \n", - "11397 15.787322 84.483374 202.707080 396.486201 376.163064 NaN \n", - "11398 13.444449 85.117130 174.178806 343.159758 332.649861 NaN \n", - "11399 14.743667 83.749534 182.613004 NaN NaN NaN \n", - "\n", - " rgdpl2te rgdpl2th rgdptt \n", - "0 NaN NaN NaN \n", - "1 NaN NaN NaN \n", - "2 NaN NaN NaN \n", - "3 NaN NaN NaN \n", - "4 NaN NaN NaN \n", - "... ... ... ... \n", - "11395 390.907086 NaN 169.097559 \n", - "11396 377.352394 NaN 179.368685 \n", - "11397 345.764991 NaN 173.113448 \n", - "11398 302.945712 NaN 142.329054 \n", - "11399 314.171069 NaN 151.435285 \n", - "\n", - "[11400 rows x 37 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.apply(lambda row: row, axis=1)" - ] - }, - { - "cell_type": "markdown", - "id": "480ca978", - "metadata": {}, - "source": [ - "在这个例子中,`apply` 有个参数为 `axis`,`axis = 1` 设置函数对每一行操作;`axis = 0` 设置函数对每一列操作;默认 `axis = 0`。\n", - "\n", - "例:和 `.loc[]` 一起使用,进行更高级的数据切片。`.apply()` 返回对每一行做条件判断的一系列布尔值,以 `[]` 操作选择部分列。下面的选择条件为:如果 `country` 列属于特定国家,且 `POP > 40000`;如果 `country` 列不属于特定国家,且 `POP < 20000`" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "ab6564ef", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:37.675480Z", - "iopub.status.busy": "2023-09-11T14:28:37.674887Z", - "iopub.status.idle": "2023-09-11T14:28:37.921802Z", - "shell.execute_reply": "2023-09-11T14:28:37.920543Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(0 True\n", - " 1 True\n", - " 2 True\n", - " 3 True\n", - " 4 True\n", - " ... \n", - " 11395 True\n", - " 11396 True\n", - " 11397 True\n", - " 11398 True\n", - " 11399 True\n", - " Length: 11400, dtype: bool,\n", - " ['country', 'year', 'POP', 'XRAT', 'tcgdp'])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "complexCondition = df.apply(\n", - "lambda row: row.POP > 40000 if row.country in ['Argentina', 'India', 'South Africa'] else row.POP < 20000,\n", - "axis=1), ['country', 'year', 'POP', 'XRAT', 'tcgdp']\n", - "complexCondition" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "32dc28b4", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:37.926687Z", - "iopub.status.busy": "2023-09-11T14:28:37.926322Z", - "iopub.status.idle": "2023-09-11T14:28:37.944395Z", - "shell.execute_reply": "2023-09-11T14:28:37.943197Z" - } - }, - "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", - "
countryyearPOPXRATtcgdp
0Afghanistan19508150.368NaNNaN
1Afghanistan19518284.473NaNNaN
2Afghanistan19528425.333NaNNaN
3Afghanistan19538573.217NaNNaN
4Afghanistan19548728.408NaNNaN
..................
11395Zimbabwe200511639.4702.236364e+011968.205961
11396Zimbabwe200611544.3261.643606e+022132.305773
11397Zimbabwe200711443.1879.675781e+032107.937100
11398Zimbabwe200811350.0006.715424e+091772.209867
11399Zimbabwe200911383.0001.400000e+171906.049843
\n", - "

9231 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - " country year POP XRAT tcgdp\n", - "0 Afghanistan 1950 8150.368 NaN NaN\n", - "1 Afghanistan 1951 8284.473 NaN NaN\n", - "2 Afghanistan 1952 8425.333 NaN NaN\n", - "3 Afghanistan 1953 8573.217 NaN NaN\n", - "4 Afghanistan 1954 8728.408 NaN NaN\n", - "... ... ... ... ... ...\n", - "11395 Zimbabwe 2005 11639.470 2.236364e+01 1968.205961\n", - "11396 Zimbabwe 2006 11544.326 1.643606e+02 2132.305773\n", - "11397 Zimbabwe 2007 11443.187 9.675781e+03 2107.937100\n", - "11398 Zimbabwe 2008 11350.000 6.715424e+09 1772.209867\n", - "11399 Zimbabwe 2009 11383.000 1.400000e+17 1906.049843\n", - "\n", - "[9231 rows x 5 columns]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.loc[complexCondition]" - ] - }, - { - "cell_type": "markdown", - "id": "250482c2", - "metadata": {}, - "source": [ - "则返回符合条件的行和列。\n", - "\n", - "## 更改 DataFrame \n", - "\n", - "更改 `DataFrame` 的部分值(行、列)在数据分析过程中十分重要。\n", - "\n", - "- `.where()` 函数保留行,并用其他值替代其余行。\n", - "\n", - "例:找出 POP 大于 20000 的行,保留这些行,其余部分用 `other` 替代,`other` 参数可以是任意值,比如 0 、\"hello\" 等。" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "6c300dae", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:37.950698Z", - "iopub.status.busy": "2023-09-11T14:28:37.950190Z", - "iopub.status.idle": "2023-09-11T14:28:38.022532Z", - "shell.execute_reply": "2023-09-11T14:28:38.021386Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
0FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
1FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
2FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
3FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
4FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
..................................................................
11395FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
11396FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
11397FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
11398FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
11399FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", - "

11400 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit ppp tcgdp cgdp \\\n", - "0 False False False False False False False False False \n", - "1 False False False False False False False False False \n", - "2 False False False False False False False False False \n", - "3 False False False False False False False False False \n", - "4 False False False False False False False False False \n", - "... ... ... ... ... ... ... ... ... ... \n", - "11395 False False False False False False False False False \n", - "11396 False False False False False False False False False \n", - "11397 False False False False False False False False False \n", - "11398 False False False False False False False False False \n", - "11399 False False False False False False False False False \n", - "\n", - " cgdp2 ... kg ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "0 False ... False False False False False False False \n", - "1 False ... False False False False False False False \n", - "2 False ... False False False False False False False \n", - "3 False ... False False False False False False False \n", - "4 False ... False False False False False False False \n", - "... ... ... ... ... ... ... ... ... ... \n", - "11395 False ... False False False False False False False \n", - "11396 False ... False False False False False False False \n", - "11397 False ... False False False False False False False \n", - "11398 False ... False False False False False False False \n", - "11399 False ... False False False False False False False \n", - "\n", - " rgdpl2te rgdpl2th rgdptt \n", - "0 False False False \n", - "1 False False False \n", - "2 False False False \n", - "3 False False False \n", - "4 False False False \n", - "... ... ... ... \n", - "11395 False False False \n", - "11396 False False False \n", - "11397 False False False \n", - "11398 False False False \n", - "11399 False False False \n", - "\n", - "[11400 rows x 37 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.where(df.POP > 20000, other=False)" - ] - }, - { - "cell_type": "markdown", - "id": "b9eac8bc", - "metadata": {}, - "source": [ - "- `.loc[]` 函数指定想修改的列,并赋值。\n", - "\n", - "例:找出 cg 列的最大值,赋值为 1 。" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "c4510d9c", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:38.026168Z", - "iopub.status.busy": "2023-09-11T14:28:38.025853Z", - "iopub.status.idle": "2023-09-11T14:28:38.030340Z", - "shell.execute_reply": "2023-09-11T14:28:38.029752Z" - } - }, - "outputs": [], - "source": [ - "df.loc[df.cg == max(df.cg), 'cg'] = 1" - ] - }, - { - "cell_type": "markdown", - "id": "96d7891a", - "metadata": {}, - "source": [ - "- `.apply()` 函数,根据自定义函数修改行和列。\n", - "\n", - "例:将 POP 小于 10000 的修改为 1, 将 XRAT 缩小十倍。" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "6dd29f6e", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:38.033440Z", - "iopub.status.busy": "2023-09-11T14:28:38.033123Z", - "iopub.status.idle": "2023-09-11T14:28:39.460671Z", - "shell.execute_reply": "2023-09-11T14:28:39.459513Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
0AfghanistanAFG19501.000NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1AfghanistanAFG19511.000NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2AfghanistanAFG19521.000NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3AfghanistanAFG19531.000NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4AfghanistanAFG19541.000NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
11395ZimbabweZWE200511639.4702.236364e+00Zimbabwe Dollar39.4828291968.205961169.097559184.183929...6.9957709.37627289.399427214.739197418.970867418.970867NaN390.907086NaN169.097559
11396ZimbabweZWE200611544.3261.643606e+01Zimbabwe Dollar384.8996512132.305773184.705956192.953943...7.64802014.98682381.697014217.543648424.754259407.262097NaN377.352394NaN179.368685
11397ZimbabweZWE200711443.1879.675781e+02Zimbabwe Dollar38583.3239602107.937100184.208918198.215361...8.38710615.78732284.483374202.707080396.486201376.163064NaN345.764991NaN173.113448
11398ZimbabweZWE200811350.0006.715424e+08Zimbabwe Dollar38723.9577401772.209867156.141839162.112294...7.68531213.44444985.117130174.178806343.159758332.649861NaN302.945712NaN142.329054
11399ZimbabweZWE200911383.0001.400000e+16Zimbabwe Dollar40289.9589901906.049843167.447056174.419700...7.90552514.74366783.749534182.613004NaNNaNNaN314.171069NaN151.435285
\n", - "

11400 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "0 Afghanistan AFG 1950 1.000 NaN NaN \n", - "1 Afghanistan AFG 1951 1.000 NaN NaN \n", - "2 Afghanistan AFG 1952 1.000 NaN NaN \n", - "3 Afghanistan AFG 1953 1.000 NaN NaN \n", - "4 Afghanistan AFG 1954 1.000 NaN NaN \n", - "... ... ... ... ... ... ... \n", - "11395 Zimbabwe ZWE 2005 11639.470 2.236364e+00 Zimbabwe Dollar \n", - "11396 Zimbabwe ZWE 2006 11544.326 1.643606e+01 Zimbabwe Dollar \n", - "11397 Zimbabwe ZWE 2007 11443.187 9.675781e+02 Zimbabwe Dollar \n", - "11398 Zimbabwe ZWE 2008 11350.000 6.715424e+08 Zimbabwe Dollar \n", - "11399 Zimbabwe ZWE 2009 11383.000 1.400000e+16 Zimbabwe Dollar \n", - "\n", - " ppp tcgdp cgdp cgdp2 ... kg \\\n", - "0 NaN NaN NaN NaN ... NaN \n", - "1 NaN NaN NaN NaN ... NaN \n", - "2 NaN NaN NaN NaN ... NaN \n", - "3 NaN NaN NaN NaN ... NaN \n", - "4 NaN NaN NaN NaN ... NaN \n", - "... ... ... ... ... ... ... \n", - "11395 39.482829 1968.205961 169.097559 184.183929 ... 6.995770 \n", - "11396 384.899651 2132.305773 184.705956 192.953943 ... 7.648020 \n", - "11397 38583.323960 2107.937100 184.208918 198.215361 ... 8.387106 \n", - "11398 38723.957740 1772.209867 156.141839 162.112294 ... 7.685312 \n", - "11399 40289.958990 1906.049843 167.447056 174.419700 ... 7.905525 \n", - "\n", - " ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "0 NaN NaN NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN NaN NaN \n", - "2 NaN NaN NaN NaN NaN NaN \n", - "3 NaN NaN NaN NaN NaN NaN \n", - "4 NaN NaN NaN NaN NaN NaN \n", - "... ... ... ... ... ... ... \n", - "11395 9.376272 89.399427 214.739197 418.970867 418.970867 NaN \n", - "11396 14.986823 81.697014 217.543648 424.754259 407.262097 NaN \n", - "11397 15.787322 84.483374 202.707080 396.486201 376.163064 NaN \n", - "11398 13.444449 85.117130 174.178806 343.159758 332.649861 NaN \n", - "11399 14.743667 83.749534 182.613004 NaN NaN NaN \n", - "\n", - " rgdpl2te rgdpl2th rgdptt \n", - "0 NaN NaN NaN \n", - "1 NaN NaN NaN \n", - "2 NaN NaN NaN \n", - "3 NaN NaN NaN \n", - "4 NaN NaN NaN \n", - "... ... ... ... \n", - "11395 390.907086 NaN 169.097559 \n", - "11396 377.352394 NaN 179.368685 \n", - "11397 345.764991 NaN 173.113448 \n", - "11398 302.945712 NaN 142.329054 \n", - "11399 314.171069 NaN 151.435285 \n", - "\n", - "[11400 rows x 37 columns]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def update_row(row):\n", - " # modify POP\n", - " row.POP = 1 if row.POP<= 10000 else row.POP\n", - "\n", - " # modify XRAT\n", - " row.XRAT = row.XRAT / 10\n", - " return row\n", - "\n", - "df.apply(update_row, axis=1)" - ] - }, - { - "cell_type": "markdown", - "id": "9b6c7303", - "metadata": {}, - "source": [ - "- `.applymap()` 函数,修改 `DataFrame` 中的所有单独元素。\n", - "\n", - "例:将 DataFrame 中的数值型元素保留两位小数。" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "e29528b3", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:39.464843Z", - "iopub.status.busy": "2023-09-11T14:28:39.464429Z", - "iopub.status.idle": "2023-09-11T14:28:39.710927Z", - "shell.execute_reply": "2023-09-11T14:28:39.709878Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/4n/v40br47s46ggrjm9bdm64lwh0000gn/T/ipykernel_85795/832431325.py:1: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", - " df.applymap(lambda x : round(x, 2) if type(x)!=str else x)\n" - ] - }, - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
0AfghanistanAFG19508150.37NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1AfghanistanAFG19518284.47NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2AfghanistanAFG19528425.33NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3AfghanistanAFG19538573.22NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4AfghanistanAFG19548728.41NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
11395ZimbabweZWE200511639.472.236000e+01Zimbabwe Dollar39.481968.21169.10184.18...7.009.3889.40214.74418.97418.97NaN390.91NaN169.10
11396ZimbabweZWE200611544.331.643600e+02Zimbabwe Dollar384.902132.31184.71192.95...7.6514.9981.70217.54424.75407.26NaN377.35NaN179.37
11397ZimbabweZWE200711443.199.675780e+03Zimbabwe Dollar38583.322107.94184.21198.22...8.3915.7984.48202.71396.49376.16NaN345.76NaN173.11
11398ZimbabweZWE200811350.006.715424e+09Zimbabwe Dollar38723.961772.21156.14162.11...7.6913.4485.12174.18343.16332.65NaN302.95NaN142.33
11399ZimbabweZWE200911383.001.400000e+17Zimbabwe Dollar40289.961906.05167.45174.42...7.9114.7483.75182.61NaNNaNNaN314.17NaN151.44
\n", - "

11400 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "0 Afghanistan AFG 1950 8150.37 NaN NaN \n", - "1 Afghanistan AFG 1951 8284.47 NaN NaN \n", - "2 Afghanistan AFG 1952 8425.33 NaN NaN \n", - "3 Afghanistan AFG 1953 8573.22 NaN NaN \n", - "4 Afghanistan AFG 1954 8728.41 NaN NaN \n", - "... ... ... ... ... ... ... \n", - "11395 Zimbabwe ZWE 2005 11639.47 2.236000e+01 Zimbabwe Dollar \n", - "11396 Zimbabwe ZWE 2006 11544.33 1.643600e+02 Zimbabwe Dollar \n", - "11397 Zimbabwe ZWE 2007 11443.19 9.675780e+03 Zimbabwe Dollar \n", - "11398 Zimbabwe ZWE 2008 11350.00 6.715424e+09 Zimbabwe Dollar \n", - "11399 Zimbabwe ZWE 2009 11383.00 1.400000e+17 Zimbabwe Dollar \n", - "\n", - " ppp tcgdp cgdp cgdp2 ... kg ki openk rgdpeqa \\\n", - "0 NaN NaN NaN NaN ... NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN ... NaN NaN NaN NaN \n", - "2 NaN NaN NaN NaN ... NaN NaN NaN NaN \n", - "3 NaN NaN NaN NaN ... NaN NaN NaN NaN \n", - "4 NaN NaN NaN NaN ... NaN NaN NaN NaN \n", - "... ... ... ... ... ... ... ... ... ... \n", - "11395 39.48 1968.21 169.10 184.18 ... 7.00 9.38 89.40 214.74 \n", - "11396 384.90 2132.31 184.71 192.95 ... 7.65 14.99 81.70 217.54 \n", - "11397 38583.32 2107.94 184.21 198.22 ... 8.39 15.79 84.48 202.71 \n", - "11398 38723.96 1772.21 156.14 162.11 ... 7.69 13.44 85.12 174.18 \n", - "11399 40289.96 1906.05 167.45 174.42 ... 7.91 14.74 83.75 182.61 \n", - "\n", - " rgdpwok rgdpl2wok rgdpl2pe rgdpl2te rgdpl2th rgdptt \n", - "0 NaN NaN NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN NaN NaN \n", - "2 NaN NaN NaN NaN NaN NaN \n", - "3 NaN NaN NaN NaN NaN NaN \n", - "4 NaN NaN NaN NaN NaN NaN \n", - "... ... ... ... ... ... ... \n", - "11395 418.97 418.97 NaN 390.91 NaN 169.10 \n", - "11396 424.75 407.26 NaN 377.35 NaN 179.37 \n", - "11397 396.49 376.16 NaN 345.76 NaN 173.11 \n", - "11398 343.16 332.65 NaN 302.95 NaN 142.33 \n", - "11399 NaN NaN NaN 314.17 NaN 151.44 \n", - "\n", - "[11400 rows x 37 columns]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.applymap(lambda x : round(x, 2) if type(x)!=str else x)" - ] - }, - { - "cell_type": "markdown", - "id": "dcc43ccf", - "metadata": {}, - "source": [ - "- `del` 函数删除指定列。\n", - "\n", - "例:删除 `ppp` 列。" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "c04e8f50", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:39.715099Z", - "iopub.status.busy": "2023-09-11T14:28:39.714478Z", - "iopub.status.idle": "2023-09-11T14:28:39.718825Z", - "shell.execute_reply": "2023-09-11T14:28:39.717978Z" - } - }, - "outputs": [], - "source": [ - "del df['ppp']" - ] - }, - { - "cell_type": "markdown", - "id": "de4ef956", - "metadata": {}, - "source": [ - "- `df['new_column'] = values` 增加新列。\n", - "\n", - "例:增加一列 `GDP percap` 显示人均 GDP。" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "cefaca74", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:39.722392Z", - "iopub.status.busy": "2023-09-11T14:28:39.722056Z", - "iopub.status.idle": "2023-09-11T14:28:39.727614Z", - "shell.execute_reply": "2023-09-11T14:28:39.726718Z" - } - }, - "outputs": [], - "source": [ - "df['GDP percap'] = df['tcgdp'] / df['POP']" - ] - }, - { - "cell_type": "markdown", - "id": "c6994bf7", - "metadata": {}, - "source": [ - "- `astype()` 更改变量数据类型\n", - "\n", - "例:将 country 列改为字符串类型。" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "33855099", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:39.731589Z", - "iopub.status.busy": "2023-09-11T14:28:39.731213Z", - "iopub.status.idle": "2023-09-11T14:28:39.735835Z", - "shell.execute_reply": "2023-09-11T14:28:39.735058Z" - } - }, - "outputs": [], - "source": [ - "df.country = df.country.astype('str')" - ] - }, - { - "cell_type": "markdown", - "id": "6e8b4a90", - "metadata": {}, - "source": [ - "## 数据排序\n", - "\n", - "在很多分析任务中,需要按照某个或某些指标对数据进行排序。pandas 在排序时,根据排序的对象不同可细分为 `sort_values` 和 `sort_index`, 与其字面意义相一致,分别代表了对值进行排序和对索引 index 进行排序。\n", - "\n", - "- `.sort_values()` 函数,按照指定列排序。\n", - "\n", - "形如 `.sort_values(by='column1', ascending = True/False)`,`ascending` 参数设置为 True 表示升序,False 为降序。例如按照 POP 列升序排列:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "7a7a176f", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:39.739449Z", - "iopub.status.busy": "2023-09-11T14:28:39.739159Z", - "iopub.status.idle": "2023-09-11T14:28:39.769494Z", - "shell.execute_reply": "2023-09-11T14:28:39.768739Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unittcgdpcgdpcgdp2cda2...kiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdpttGDP percap
7740PalauPLW19507.251NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7741PalauPLW19517.448NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7742PalauPLW19527.651NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7743PalauPLW19537.859NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7744PalauPLW19548.073NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
2218China Version 2CH220081317066.0006.95Yuan Renminbi10557315.238015.7829848416.4803457551.673672...37.62945069.8831277777.94587111929.0495211929.04952NaN11938.30669NaN7233.0900718.015783
2219China Version 2CH220091323592.0006.83Yuan Renminbi11342464.268569.4566439227.1872968531.307128...39.04420361.2403428247.646160NaNNaNNaN12658.65025NaN7747.3316188.569457
2159China Version 1CHN20091323592.0006.83Yuan Renminbi10739325.588113.7734108296.5756907651.109254...46.70784258.5794807782.385295NaNNaNNaN11914.32395NaN7314.9306068.113773
10020TajikistanTJK1950NaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
10021TajikistanTJK1951NaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "

11400 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "7740 Palau PLW 1950 7.251 NaN NaN \n", - "7741 Palau PLW 1951 7.448 NaN NaN \n", - "7742 Palau PLW 1952 7.651 NaN NaN \n", - "7743 Palau PLW 1953 7.859 NaN NaN \n", - "7744 Palau PLW 1954 8.073 NaN NaN \n", - "... ... ... ... ... ... ... \n", - "2218 China Version 2 CH2 2008 1317066.000 6.95 Yuan Renminbi \n", - "2219 China Version 2 CH2 2009 1323592.000 6.83 Yuan Renminbi \n", - "2159 China Version 1 CHN 2009 1323592.000 6.83 Yuan Renminbi \n", - "10020 Tajikistan TJK 1950 NaN NaN NaN \n", - "10021 Tajikistan TJK 1951 NaN NaN NaN \n", - "\n", - " tcgdp cgdp cgdp2 cda2 ... ki \\\n", - "7740 NaN NaN NaN NaN ... NaN \n", - "7741 NaN NaN NaN NaN ... NaN \n", - "7742 NaN NaN NaN NaN ... NaN \n", - "7743 NaN NaN NaN NaN ... NaN \n", - "7744 NaN NaN NaN NaN ... NaN \n", - "... ... ... ... ... ... ... \n", - "2218 10557315.23 8015.782984 8416.480345 7551.673672 ... 37.629450 \n", - "2219 11342464.26 8569.456643 9227.187296 8531.307128 ... 39.044203 \n", - "2159 10739325.58 8113.773410 8296.575690 7651.109254 ... 46.707842 \n", - "10020 NaN NaN NaN NaN ... NaN \n", - "10021 NaN NaN NaN NaN ... NaN \n", - "\n", - " openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "7740 NaN NaN NaN NaN NaN \n", - "7741 NaN NaN NaN NaN NaN \n", - "7742 NaN NaN NaN NaN NaN \n", - "7743 NaN NaN NaN NaN NaN \n", - "7744 NaN NaN NaN NaN NaN \n", - "... ... ... ... ... ... \n", - "2218 69.883127 7777.945871 11929.04952 11929.04952 NaN \n", - "2219 61.240342 8247.646160 NaN NaN NaN \n", - "2159 58.579480 7782.385295 NaN NaN NaN \n", - "10020 NaN NaN NaN NaN NaN \n", - "10021 NaN NaN NaN NaN NaN \n", - "\n", - " rgdpl2te rgdpl2th rgdptt GDP percap \n", - "7740 NaN NaN NaN NaN \n", - "7741 NaN NaN NaN NaN \n", - "7742 NaN NaN NaN NaN \n", - "7743 NaN NaN NaN NaN \n", - "7744 NaN NaN NaN NaN \n", - "... ... ... ... ... \n", - "2218 11938.30669 NaN 7233.090071 8.015783 \n", - "2219 12658.65025 NaN 7747.331618 8.569457 \n", - "2159 11914.32395 NaN 7314.930606 8.113773 \n", - "10020 NaN NaN NaN NaN \n", - "10021 NaN NaN NaN NaN \n", - "\n", - "[11400 rows x 37 columns]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = df.sort_values(by='POP', ascending = True)\n", - "df" - ] - }, - { - "cell_type": "markdown", - "id": "a1f25121", - "metadata": {}, - "source": [ - "也可以对多个列排序。例如按照 POP 列和 year 列降序排列。" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "1ab25ba2", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:39.773131Z", - "iopub.status.busy": "2023-09-11T14:28:39.772558Z", - "iopub.status.idle": "2023-09-11T14:28:39.803618Z", - "shell.execute_reply": "2023-09-11T14:28:39.802354Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unittcgdpcgdpcgdp2cda2...kiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdpttGDP percap
2219China Version 2CH220091323592.0006.830000Yuan Renminbi1.134246e+078569.4566439227.1872968531.307128...39.04420361.2403428247.646160NaNNaNNaN12658.65025NaN7747.3316188.569457
2159China Version 1CHN20091323592.0006.830000Yuan Renminbi1.073933e+078113.7734108296.5756907651.109254...46.70784258.5794807782.385295NaNNaNNaN11914.32395NaN7314.9306068.113773
2158China Version 1CHN20081317066.0006.950000Yuan Renminbi9.719402e+067379.5860697529.3972586747.223691...42.86283668.7600687132.31555010938.8451410929.28222NaN10937.76354NaN6635.5266737.379586
2218China Version 2CH220081317066.0006.950000Yuan Renminbi1.055732e+078015.7829848416.4803457551.673672...37.62945069.8831277777.94587111929.0495211929.04952NaN11938.30669NaN7233.0900718.015783
2217China Version 2CH220071310584.0007.607532Yuan Renminbi9.407736e+067178.2780547437.4019206803.244389...37.63404769.2450567357.71376111290.4329511290.43295NaN11288.33089NaN6690.0869247.178278
..................................................................
7742PalauPLW19527.651NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7741PalauPLW19517.448NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7740PalauPLW19507.251NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
10021TajikistanTJK1951NaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
10020TajikistanTJK1950NaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "

11400 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "2219 China Version 2 CH2 2009 1323592.000 6.830000 Yuan Renminbi \n", - "2159 China Version 1 CHN 2009 1323592.000 6.830000 Yuan Renminbi \n", - "2158 China Version 1 CHN 2008 1317066.000 6.950000 Yuan Renminbi \n", - "2218 China Version 2 CH2 2008 1317066.000 6.950000 Yuan Renminbi \n", - "2217 China Version 2 CH2 2007 1310584.000 7.607532 Yuan Renminbi \n", - "... ... ... ... ... ... ... \n", - "7742 Palau PLW 1952 7.651 NaN NaN \n", - "7741 Palau PLW 1951 7.448 NaN NaN \n", - "7740 Palau PLW 1950 7.251 NaN NaN \n", - "10021 Tajikistan TJK 1951 NaN NaN NaN \n", - "10020 Tajikistan TJK 1950 NaN NaN NaN \n", - "\n", - " tcgdp cgdp cgdp2 cda2 ... ki \\\n", - "2219 1.134246e+07 8569.456643 9227.187296 8531.307128 ... 39.044203 \n", - "2159 1.073933e+07 8113.773410 8296.575690 7651.109254 ... 46.707842 \n", - "2158 9.719402e+06 7379.586069 7529.397258 6747.223691 ... 42.862836 \n", - "2218 1.055732e+07 8015.782984 8416.480345 7551.673672 ... 37.629450 \n", - "2217 9.407736e+06 7178.278054 7437.401920 6803.244389 ... 37.634047 \n", - "... ... ... ... ... ... ... \n", - "7742 NaN NaN NaN NaN ... NaN \n", - "7741 NaN NaN NaN NaN ... NaN \n", - "7740 NaN NaN NaN NaN ... NaN \n", - "10021 NaN NaN NaN NaN ... NaN \n", - "10020 NaN NaN NaN NaN ... NaN \n", - "\n", - " openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "2219 61.240342 8247.646160 NaN NaN NaN \n", - "2159 58.579480 7782.385295 NaN NaN NaN \n", - "2158 68.760068 7132.315550 10938.84514 10929.28222 NaN \n", - "2218 69.883127 7777.945871 11929.04952 11929.04952 NaN \n", - "2217 69.245056 7357.713761 11290.43295 11290.43295 NaN \n", - "... ... ... ... ... ... \n", - "7742 NaN NaN NaN NaN NaN \n", - "7741 NaN NaN NaN NaN NaN \n", - "7740 NaN NaN NaN NaN NaN \n", - "10021 NaN NaN NaN NaN NaN \n", - "10020 NaN NaN NaN NaN NaN \n", - "\n", - " rgdpl2te rgdpl2th rgdptt GDP percap \n", - "2219 12658.65025 NaN 7747.331618 8.569457 \n", - "2159 11914.32395 NaN 7314.930606 8.113773 \n", - "2158 10937.76354 NaN 6635.526673 7.379586 \n", - "2218 11938.30669 NaN 7233.090071 8.015783 \n", - "2217 11288.33089 NaN 6690.086924 7.178278 \n", - "... ... ... ... ... \n", - "7742 NaN NaN NaN NaN \n", - "7741 NaN NaN NaN NaN \n", - "7740 NaN NaN NaN NaN \n", - "10021 NaN NaN NaN NaN \n", - "10020 NaN NaN NaN NaN \n", - "\n", - "[11400 rows x 37 columns]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = df.sort_values(by=['POP','year'], ascending = False)\n", - "df" - ] - }, - { - "cell_type": "markdown", - "id": "9f5ef86c", - "metadata": {}, - "source": [ - "- `.sort_index()` 函数,按照现有的 index 索引排序,index 通常为打印 `DataFrame` 时,最左侧没有任何列名的那一列。" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "7b7430e2", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:39.809399Z", - "iopub.status.busy": "2023-09-11T14:28:39.808909Z", - "iopub.status.idle": "2023-09-11T14:28:39.838421Z", - "shell.execute_reply": "2023-09-11T14:28:39.837496Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unittcgdpcgdpcgdp2cda2...kiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdpttGDP percap
0AfghanistanAFG19508150.368NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1AfghanistanAFG19518284.473NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2AfghanistanAFG19528425.333NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3AfghanistanAFG19538573.217NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4AfghanistanAFG19548728.408NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
11395ZimbabweZWE200511639.4702.236364e+01Zimbabwe Dollar1968.205961169.097559184.183929203.065978...9.37627289.399427214.739197418.970867418.970867NaN390.907086NaN169.0975590.169098
11396ZimbabweZWE200611544.3261.643606e+02Zimbabwe Dollar2132.305773184.705956192.953943201.489048...14.98682381.697014217.543648424.754259407.262097NaN377.352394NaN179.3686850.184706
11397ZimbabweZWE200711443.1879.675781e+03Zimbabwe Dollar2107.937100184.208918198.215361199.155404...15.78732284.483374202.707080396.486201376.163064NaN345.764991NaN173.1134480.184209
11398ZimbabweZWE200811350.0006.715424e+09Zimbabwe Dollar1772.209867156.141839162.112294170.488034...13.44444985.117130174.178806343.159758332.649861NaN302.945712NaN142.3290540.156142
11399ZimbabweZWE200911383.0001.400000e+17Zimbabwe Dollar1906.049843167.447056174.419700180.230237...14.74366783.749534182.613004NaNNaNNaN314.171069NaN151.4352850.167447
\n", - "

11400 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "0 Afghanistan AFG 1950 8150.368 NaN NaN \n", - "1 Afghanistan AFG 1951 8284.473 NaN NaN \n", - "2 Afghanistan AFG 1952 8425.333 NaN NaN \n", - "3 Afghanistan AFG 1953 8573.217 NaN NaN \n", - "4 Afghanistan AFG 1954 8728.408 NaN NaN \n", - "... ... ... ... ... ... ... \n", - "11395 Zimbabwe ZWE 2005 11639.470 2.236364e+01 Zimbabwe Dollar \n", - "11396 Zimbabwe ZWE 2006 11544.326 1.643606e+02 Zimbabwe Dollar \n", - "11397 Zimbabwe ZWE 2007 11443.187 9.675781e+03 Zimbabwe Dollar \n", - "11398 Zimbabwe ZWE 2008 11350.000 6.715424e+09 Zimbabwe Dollar \n", - "11399 Zimbabwe ZWE 2009 11383.000 1.400000e+17 Zimbabwe Dollar \n", - "\n", - " tcgdp cgdp cgdp2 cda2 ... ki \\\n", - "0 NaN NaN NaN NaN ... NaN \n", - "1 NaN NaN NaN NaN ... NaN \n", - "2 NaN NaN NaN NaN ... NaN \n", - "3 NaN NaN NaN NaN ... NaN \n", - "4 NaN NaN NaN NaN ... NaN \n", - "... ... ... ... ... ... ... \n", - "11395 1968.205961 169.097559 184.183929 203.065978 ... 9.376272 \n", - "11396 2132.305773 184.705956 192.953943 201.489048 ... 14.986823 \n", - "11397 2107.937100 184.208918 198.215361 199.155404 ... 15.787322 \n", - "11398 1772.209867 156.141839 162.112294 170.488034 ... 13.444449 \n", - "11399 1906.049843 167.447056 174.419700 180.230237 ... 14.743667 \n", - "\n", - " openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te \\\n", - "0 NaN NaN NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN NaN NaN \n", - "2 NaN NaN NaN NaN NaN NaN \n", - "3 NaN NaN NaN NaN NaN NaN \n", - "4 NaN NaN NaN NaN NaN NaN \n", - "... ... ... ... ... ... ... \n", - "11395 89.399427 214.739197 418.970867 418.970867 NaN 390.907086 \n", - "11396 81.697014 217.543648 424.754259 407.262097 NaN 377.352394 \n", - "11397 84.483374 202.707080 396.486201 376.163064 NaN 345.764991 \n", - "11398 85.117130 174.178806 343.159758 332.649861 NaN 302.945712 \n", - "11399 83.749534 182.613004 NaN NaN NaN 314.171069 \n", - "\n", - " rgdpl2th rgdptt GDP percap \n", - "0 NaN NaN NaN \n", - "1 NaN NaN NaN \n", - "2 NaN NaN NaN \n", - "3 NaN NaN NaN \n", - "4 NaN NaN NaN \n", - "... ... ... ... \n", - "11395 NaN 169.097559 0.169098 \n", - "11396 NaN 179.368685 0.184706 \n", - "11397 NaN 173.113448 0.184209 \n", - "11398 NaN 142.329054 0.156142 \n", - "11399 NaN 151.435285 0.167447 \n", - "\n", - "[11400 rows x 37 columns]" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.sort_index()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/_sources/ch-pandas/dataframe-groupby.ipynb b/docs/_sources/ch-pandas/dataframe-groupby.ipynb deleted file mode 100644 index 714f2c78..00000000 --- a/docs/_sources/ch-pandas/dataframe-groupby.ipynb +++ /dev/null @@ -1,1076 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "eed3aae1", - "metadata": {}, - "source": [ - "# 分组汇总\n", - "\n", - "实际的数据分析中,经常需要对某一类数据进行统计分析。比如,假如我们拥有全国所有人的身高和体重数据,我们想按照省份分组,统计每个省的平均身高和平均体重,这时候就需要使用分组操作。pandas 提供了 `groupby` 函数进行类似的分组汇总操作。{numref}`groupby-img` 计算平均身高的分组汇总流程,主要包括两部分:分组与汇总。其中分组阶段将同一类的内容归结到相同的组中;汇总阶段将所关心的数据进行计算,比如求和、求平均等。\n", - "\n", - "按哪些字段进行分组,这些字段又被成为 ** 分组变量 **。对其他字段进行汇总,其他汇总字段被成为 ** 汇总变量 **。对汇总变量进行计算,被称为 ** 汇总统计量 **。\n", - "\n", - "```{figure} ../img/ch-pandas/groupby.svg\n", - "---\n", - "name: groupby-img\n", - "---\n", - "分组与汇总\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "6f177573", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:08:11.016564Z", - "iopub.status.busy": "2023-09-18T00:08:11.016110Z", - "iopub.status.idle": "2023-09-18T00:08:11.605146Z", - "shell.execute_reply": "2023-09-18T00:08:11.604394Z" - }, - "tags": [ - "hide-cell" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "文件夹已存在,无需操作。\n" - ] - } - ], - "source": [ - "import os\n", - "import urllib.request\n", - "import zipfile\n", - "import pandas as pd\n", - "\n", - "folder_path = os.path.join(os.getcwd(), \"../data/pwt\")\n", - "download_url = \"https://www.rug.nl/ggdc/docs/pwt70_06032011version.zip\"\n", - "file_name = download_url.split(\"/\")[-1]\n", - "if not os.path.exists(folder_path):\n", - " # 创建文件夹\n", - " os.makedirs(folder_path)\n", - " print(f\"文件夹不存在,已创建。\")\n", - "\n", - " zip_file_path = os.path.join(folder_path, file_name)\n", - "\n", - " urllib.request.urlretrieve(download_url, zip_file_path)\n", - " with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:\n", - " zip_ref.extractall(folder_path)\n", - " print(\"数据已下载并解压缩。\")\n", - "else:\n", - " print(f\"文件夹已存在,无需操作。\")\n", - "\n", - "df = pd.read_csv(os.path.join(folder_path, \"pwt70_w_country_names.csv\"))\n", - "df = df.fillna(0)" - ] - }, - { - "cell_type": "markdown", - "id": "3bd5bd26", - "metadata": {}, - "source": [ - "## 分组变量\n", - "\n", - "在进行分组汇总时,分组变量可以有一个或多个。\n", - "\n", - "例如,按照 `country` 和 `year` 分组,并对 `tcgdp` 汇总求平均值,此时在 `groupby` 后接多个分组变量,以列表形式写出。或者是 `.groupby(by=['country','year'])`。`.groupby` 之后要接上所需要汇总的字段,这个例子是 `tcgdp`。最后要接上所需要进行的汇总计算,比如 `.mean()`。计算结果中产生了多个索引,本例中是 `country` 和 `year`,指代相应组的情况。" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "71771b9e", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:08:11.650098Z", - "iopub.status.busy": "2023-09-18T00:08:11.649662Z", - "iopub.status.idle": "2023-09-18T00:08:11.685301Z", - "shell.execute_reply": "2023-09-18T00:08:11.684067Z" - } - }, - "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", - "
tcgdp
countryyear
Afghanistan19500.000000
19510.000000
19520.000000
19530.000000
19540.000000
.........
Zimbabwe20051968.205961
20062132.305773
20072107.937100
20081772.209867
20091906.049843
\n", - "

11400 rows × 1 columns

\n", - "
" - ], - "text/plain": [ - " tcgdp\n", - "country year \n", - "Afghanistan 1950 0.000000\n", - " 1951 0.000000\n", - " 1952 0.000000\n", - " 1953 0.000000\n", - " 1954 0.000000\n", - "... ...\n", - "Zimbabwe 2005 1968.205961\n", - " 2006 2132.305773\n", - " 2007 2107.937100\n", - " 2008 1772.209867\n", - " 2009 1906.049843\n", - "\n", - "[11400 rows x 1 columns]" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.groupby(['country','year'])[['tcgdp']].mean()" - ] - }, - { - "cell_type": "markdown", - "id": "c7adaedb", - "metadata": {}, - "source": [ - "## 汇总变量\n", - "\n", - "在进行分组汇总时,汇总变量也可以有一个或多个。\n", - "\n", - "例如按照 `year` 汇总 `tcgdp` 和 `POP`,在 `.groupby` 后直接使用 `[]` 筛选相应列,再接汇总统计量。" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "fece8669", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:08:11.690684Z", - "iopub.status.busy": "2023-09-18T00:08:11.690289Z", - "iopub.status.idle": "2023-09-18T00:08:11.887520Z", - "shell.execute_reply": "2023-09-18T00:08:11.886290Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tcgdpPOP
year
19503954.39446716239.392063
19514541.91701116461.731179
19525150.94693016730.487389
19535483.99531017019.548668
19545692.81177517326.304137
19556196.46547717657.801874
19566640.26485117999.434226
19577104.04112818364.700442
19587528.45460518730.439042
19598148.51089119043.260395
19608828.60577619242.437274
19619128.45587919423.141142
19629687.30708219760.533626
196310351.91777520233.695226
196411269.68006120719.860558
196512105.69127321182.282832
196613176.72281321655.463121
196714051.08423522121.536947
196815421.58474022606.150837
196917218.75898723113.133937
197021282.56727923618.829389
197123432.91068924137.869711
197225833.37931024644.483005
197329159.64660025140.115900
197432601.67805025623.884663
197536109.97016326088.471411
197640165.94772226535.470116
197744691.03377726979.055474
197850393.15225127418.046916
197956983.54096327873.890479
198063850.74860228329.849105
198170997.23187728790.876000
198275786.11696629287.531784
198381059.06606429795.689879
198488303.03198430288.007526
198594477.34288730791.765868
1986101596.41421531313.561847
1987109494.18351731863.784021
1988118048.07842132417.290021
1989126221.57949332964.028537
1990144220.07533333516.168453
1991151894.23435834055.531837
1992159301.70586334567.649100
1993168690.98070435065.424347
1994178947.61326935548.469784
1995190126.58030436030.590795
1996200132.76611636513.694642
1997210946.88984336991.605037
1998216481.94852037462.231458
1999228114.84029137920.696968
2000244206.60178438307.409353
2001255312.48706238742.535742
2002269661.40928639176.028268
2003286959.70488539606.837547
2004312186.33435040040.118863
2005344724.42019540475.047642
2006379205.67431740909.750389
2007416504.77566941347.240695
2008446441.98826241731.031032
2009448186.87112742174.566563
\n", - "
" - ], - "text/plain": [ - " tcgdp POP\n", - "year \n", - "1950 3954.394467 16239.392063\n", - "1951 4541.917011 16461.731179\n", - "1952 5150.946930 16730.487389\n", - "1953 5483.995310 17019.548668\n", - "1954 5692.811775 17326.304137\n", - "1955 6196.465477 17657.801874\n", - "1956 6640.264851 17999.434226\n", - "1957 7104.041128 18364.700442\n", - "1958 7528.454605 18730.439042\n", - "1959 8148.510891 19043.260395\n", - "1960 8828.605776 19242.437274\n", - "1961 9128.455879 19423.141142\n", - "1962 9687.307082 19760.533626\n", - "1963 10351.917775 20233.695226\n", - "1964 11269.680061 20719.860558\n", - "1965 12105.691273 21182.282832\n", - "1966 13176.722813 21655.463121\n", - "1967 14051.084235 22121.536947\n", - "1968 15421.584740 22606.150837\n", - "1969 17218.758987 23113.133937\n", - "1970 21282.567279 23618.829389\n", - "1971 23432.910689 24137.869711\n", - "1972 25833.379310 24644.483005\n", - "1973 29159.646600 25140.115900\n", - "1974 32601.678050 25623.884663\n", - "1975 36109.970163 26088.471411\n", - "1976 40165.947722 26535.470116\n", - "1977 44691.033777 26979.055474\n", - "1978 50393.152251 27418.046916\n", - "1979 56983.540963 27873.890479\n", - "1980 63850.748602 28329.849105\n", - "1981 70997.231877 28790.876000\n", - "1982 75786.116966 29287.531784\n", - "1983 81059.066064 29795.689879\n", - "1984 88303.031984 30288.007526\n", - "1985 94477.342887 30791.765868\n", - "1986 101596.414215 31313.561847\n", - "1987 109494.183517 31863.784021\n", - "1988 118048.078421 32417.290021\n", - "1989 126221.579493 32964.028537\n", - "1990 144220.075333 33516.168453\n", - "1991 151894.234358 34055.531837\n", - "1992 159301.705863 34567.649100\n", - "1993 168690.980704 35065.424347\n", - "1994 178947.613269 35548.469784\n", - "1995 190126.580304 36030.590795\n", - "1996 200132.766116 36513.694642\n", - "1997 210946.889843 36991.605037\n", - "1998 216481.948520 37462.231458\n", - "1999 228114.840291 37920.696968\n", - "2000 244206.601784 38307.409353\n", - "2001 255312.487062 38742.535742\n", - "2002 269661.409286 39176.028268\n", - "2003 286959.704885 39606.837547\n", - "2004 312186.334350 40040.118863\n", - "2005 344724.420195 40475.047642\n", - "2006 379205.674317 40909.750389\n", - "2007 416504.775669 41347.240695\n", - "2008 446441.988262 41731.031032\n", - "2009 448186.871127 42174.566563" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.groupby(['year'])[['tcgdp','POP']].mean()" - ] - }, - { - "cell_type": "markdown", - "id": "0061741c", - "metadata": {}, - "source": [ - "## 汇总统计量\n", - "\n", - "`groupby` 后可接的汇总统计量有:\n", - "\n", - "- mean - 均值\n", - "\n", - "- max - 最大值\n", - "\n", - "- min - 最小值\n", - "\n", - "- median - 中位数\n", - "\n", - "- std - 标准差\n", - "\n", - "- mad - 平均绝对偏差\n", - "\n", - "- count - 计数\n", - "\n", - "- skew - 偏度\n", - "\n", - "- quantile - 指定分位数\n", - "\n", - "这些统计量可以直接接 groupby 对象使用,此外,`agg` 方法提供了一次汇总多个统计量的方法。\n", - "\n", - "例如,汇总各个国家 `country` 人口 `POP` 的均值、最大值、最小值。" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "df431ad1", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:08:11.892594Z", - "iopub.status.busy": "2023-09-18T00:08:11.892069Z", - "iopub.status.idle": "2023-09-18T00:08:11.909848Z", - "shell.execute_reply": "2023-09-18T00:08:11.909038Z" - } - }, - "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", - "
meanminmax
country
Afghanistan15707.3449178150.36831889.923
Albania2461.2080001227.1563250.778
Algeria19896.9679678892.71834178.000
Angola7295.1992004117.61712799.000
Antigua and Barbuda65.35236745.81685.700
............
Venezuela15180.6642335009.00627191.090
Vietnam54711.90218325348.14488577.000
Yemen10789.8029174777.08922858.000
Zambia6448.5864332553.00013061.000
Zimbabwe7567.0343332853.15111867.855
\n", - "

190 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " mean min max\n", - "country \n", - "Afghanistan 15707.344917 8150.368 31889.923\n", - "Albania 2461.208000 1227.156 3250.778\n", - "Algeria 19896.967967 8892.718 34178.000\n", - "Angola 7295.199200 4117.617 12799.000\n", - "Antigua and Barbuda 65.352367 45.816 85.700\n", - "... ... ... ...\n", - "Venezuela 15180.664233 5009.006 27191.090\n", - "Vietnam 54711.902183 25348.144 88577.000\n", - "Yemen 10789.802917 4777.089 22858.000\n", - "Zambia 6448.586433 2553.000 13061.000\n", - "Zimbabwe 7567.034333 2853.151 11867.855\n", - "\n", - "[190 rows x 3 columns]" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.groupby(['country'])['POP'].agg(['mean','min','max'])" - ] - }, - { - "cell_type": "markdown", - "id": "3399e365", - "metadata": {}, - "source": [ - "## 多重索引\n", - "\n", - "在进行分组汇总操作时,产生的结果并不是常见的二维表数据框,而是具有多重索引的数据框。 pandas 开发者设计这种类型的数据框是借鉴了 Excel 数据透视表的功能。\n", - "\n", - "例如,按照 `country` 和 `year` 顺序对 `tcgdp` 和 `POP` 进行分组汇总,汇总统计量为最小值和最大值。" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "a565ae44", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:08:11.914546Z", - "iopub.status.busy": "2023-09-18T00:08:11.913887Z", - "iopub.status.idle": "2023-09-18T00:08:11.955228Z", - "shell.execute_reply": "2023-09-18T00:08:11.954010Z" - } - }, - "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", - "
tcgdpPOP
minmaxminmax
countryyear
Afghanistan19500.0000000.0000008150.3688150.368
19510.0000000.0000008284.4738284.473
19520.0000000.0000008425.3338425.333
19530.0000000.0000008573.2178573.217
19540.0000000.0000008728.4088728.408
..................
Zimbabwe20051968.2059611968.20596111639.47011639.470
20062132.3057732132.30577311544.32611544.326
20072107.9371002107.93710011443.18711443.187
20081772.2098671772.20986711350.00011350.000
20091906.0498431906.04984311383.00011383.000
\n", - "

11400 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " tcgdp POP \n", - " min max min max\n", - "country year \n", - "Afghanistan 1950 0.000000 0.000000 8150.368 8150.368\n", - " 1951 0.000000 0.000000 8284.473 8284.473\n", - " 1952 0.000000 0.000000 8425.333 8425.333\n", - " 1953 0.000000 0.000000 8573.217 8573.217\n", - " 1954 0.000000 0.000000 8728.408 8728.408\n", - "... ... ... ... ...\n", - "Zimbabwe 2005 1968.205961 1968.205961 11639.470 11639.470\n", - " 2006 2132.305773 2132.305773 11544.326 11544.326\n", - " 2007 2107.937100 2107.937100 11443.187 11443.187\n", - " 2008 1772.209867 1772.209867 11350.000 11350.000\n", - " 2009 1906.049843 1906.049843 11383.000 11383.000\n", - "\n", - "[11400 rows x 4 columns]" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.groupby(['country','year'])[['tcgdp','POP']].agg(['min','max'])" - ] - }, - { - "cell_type": "markdown", - "id": "5f42640e", - "metadata": {}, - "source": [ - "此时数据框中有两个行索引(`country` 和 `year`)和两个列索引(`tcgdp` + `POP` 和 `min` + `max`)。需要筛选列时,第一个 `[]` 筛选第一重列索引(从 `tcgdp` 和 `POP` 中选择一个列),第二个 `[]` 筛选第二重列索引(从 `min` 和 `max` 中选择一个列)。\n", - "\n", - "例如,查询各个国家 `country` 各年 `year` 人口 `POP` 的最小值。" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "f0c20c2b", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:08:11.959704Z", - "iopub.status.busy": "2023-09-18T00:08:11.959341Z", - "iopub.status.idle": "2023-09-18T00:08:12.027738Z", - "shell.execute_reply": "2023-09-18T00:08:12.026497Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "country year\n", - "Afghanistan 1950 8150.368\n", - " 1951 8284.473\n", - " 1952 8425.333\n", - " 1953 8573.217\n", - " 1954 8728.408\n", - " ... \n", - "Zimbabwe 2005 11639.470\n", - " 2006 11544.326\n", - " 2007 11443.187\n", - " 2008 11350.000\n", - " 2009 11383.000\n", - "Name: min, Length: 11400, dtype: float64" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_query = df.groupby(['country','year'])[['tcgdp','POP']].agg(['min','max'])\n", - "df_query['POP']['min']" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tpch", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/_sources/ch-pandas/dataframe-merge-concat.ipynb b/docs/_sources/ch-pandas/dataframe-merge-concat.ipynb deleted file mode 100644 index 19edd669..00000000 --- a/docs/_sources/ch-pandas/dataframe-merge-concat.ipynb +++ /dev/null @@ -1,1448 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "919cc8be", - "metadata": {}, - "source": [ - "# 多表操作\n", - "\n", - "之前的操作主要在单个 `DataFrame` ,实际上,我们经常需要对多个 `DataFrame` 联合起来进行分析。pandas 提供了多 `DataFrame` 之间的合并和连接的操作,分别是 `merge()` 和 `concat()` 函数。比如,我们可以将两个 `DataFrame` 合并成一个,且保留所有的列。\n", - "\n", - "## merge\n", - "\n", - "pandas 的 `merge()` 操作可以合并两个 `DataFrame`(或者称为表) ,类似于 SQL 中的 JOIN 操作。 我们可以想象成:一个大表被拆分成两个小表,两个小表都包含一些同样的数据。现在我们需要把两个小表合并,生成一个大表,大表包含了两个小表的字段。\n", - "\n", - "```{figure} ../img/ch-pandas/merge.svg\n", - "---\n", - "width: 500px\n", - "name: merge-img\n", - "---\n", - "对两个 DataFrame 进行 merge 操作\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "5401d63b", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:28.055958Z", - "iopub.status.busy": "2023-09-18T00:21:28.055470Z", - "iopub.status.idle": "2023-09-18T00:21:28.912913Z", - "shell.execute_reply": "2023-09-18T00:21:28.910996Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "customer_prod_df:\n" - ] - }, - { - "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", - "
customer_idproduct
01Oven
12Oven
23Oven
34Television
45Television
56Television
\n", - "
" - ], - "text/plain": [ - " customer_id product\n", - "0 1 Oven\n", - "1 2 Oven\n", - "2 3 Oven\n", - "3 4 Television\n", - "4 5 Television\n", - "5 6 Television" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "# customer_prod_df\n", - "d1 = {'customer_id':pd.Series([1,2,3,4,5,6]),\n", - " 'product':pd.Series(['Oven','Oven','Oven','Television','Television','Television'])}\n", - "customer_prod_df = pd.DataFrame(d1)\n", - "print(\"customer_prod_df:\")\n", - "customer_prod_df" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "9c58fb7d", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:28.919003Z", - "iopub.status.busy": "2023-09-18T00:21:28.918278Z", - "iopub.status.idle": "2023-09-18T00:21:28.933018Z", - "shell.execute_reply": "2023-09-18T00:21:28.931754Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "customer_state_df:\n" - ] - }, - { - "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", - "
customer_idstate
02California
14California
26Texas
37New York
48Indiana
\n", - "
" - ], - "text/plain": [ - " customer_id state\n", - "0 2 California\n", - "1 4 California\n", - "2 6 Texas\n", - "3 7 New York\n", - "4 8 Indiana" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# customer_state_df\n", - "d2 = {'customer_id':pd.Series([2,4,6,7,8]),\n", - " 'state':pd.Series(['California','California','Texas','New York','Indiana'])}\n", - "customer_state_df = pd.DataFrame(d2)\n", - "print(\"customer_state_df:\")\n", - "customer_state_df" - ] - }, - { - "cell_type": "markdown", - "id": "caf8dfde", - "metadata": {}, - "source": [ - "我们先用下面的代码得到合并的结果,所使用的各类参数后面详细探讨。" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "4733ae6d", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:28.939852Z", - "iopub.status.busy": "2023-09-18T00:21:28.939384Z", - "iopub.status.idle": "2023-09-18T00:21:28.965372Z", - "shell.execute_reply": "2023-09-18T00:21:28.964057Z" - } - }, - "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", - "
customer_idproductstate
02OvenCalifornia
14TelevisionCalifornia
26TelevisionTexas
\n", - "
" - ], - "text/plain": [ - " customer_id product state\n", - "0 2 Oven California\n", - "1 4 Television California\n", - "2 6 Television Texas" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "inner_join_df= pd.merge(customer_prod_df, customer_state_df, on='customer_id', how='inner')\n", - "inner_join_df" - ] - }, - { - "cell_type": "markdown", - "id": "8a276b16", - "metadata": {}, - "source": [ - "合并两个表时,通常需要使用键(key)来判断哪些数据与哪些数据合并。比如本例中,两个表都包含 `customer_id` 这个字段,`customer_id` 可以被用来连接这两个 `DataFrame`。相同 `customer_id` 的行被合并在一起。\n", - "\n", - "我们回到 `merge` 函数的参数。完整的参数形式为:`pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False,suffixes=('_x','_y'))`。虽然参数很多,其实大部分时间我们主要关心的是 `left`、`right`、`how` 和 `on`。\n", - "\n", - "`left` 与 `right` 是两个 `DataFrame`,分别为左侧表和右侧表。\n", - "\n", - "`on` 表示两个表依据哪个字段(或哪些字段)进行合并。这个字段或这些字段被称为键(key)。两个表的 key 字段应该是表示同一个事物。现在我们要根据 key,把两个 `DataFrame` 合并成一个更大的表。这个例子中,以 `customer_id` 为字段进行合并,主要对左右两个表中相同 `customer_id` 进行操作。\n", - "\n", - "`how` 表示合并的方式。在合并过程中,左侧表和右侧表的 key 不一定都包含同样的值。比如,如果左侧表包含某个 `customer_id` 但右侧表不包含这个 `customer_id`,那应该遵循什么样的逻辑去合并。`how='inner'` 是其中一种方式,叫做内连接:只有在左侧 DataFrame 和右侧 DataFrame 中 ** 都 ** 存在的行才会包含在结果中。\n", - "\n", - "`how` 除了 `inner`,还有其他的选项:`outer`、`left` 和 `right`。\n", - "\n", - "![合并方式](../img/ch-pandas/merge-how.svg)\n", - ":width:`800px`\n", - ":label:`merge-how`\n", - "\n", - "### 连接方式\n", - "\n", - "* 外连接\n", - "\n", - "外连接把左右两侧所有的数据都合并到一起,如果某个表有缺失值,无法左右对齐,则填充 `NaN`。" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "d4748529", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:28.970312Z", - "iopub.status.busy": "2023-09-18T00:21:28.969862Z", - "iopub.status.idle": "2023-09-18T00:21:28.986406Z", - "shell.execute_reply": "2023-09-18T00:21:28.985188Z" - } - }, - "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", - "
customer_idproductstate
01OvenNaN
12OvenCalifornia
23OvenNaN
34TelevisionCalifornia
45TelevisionNaN
56TelevisionTexas
67NaNNew York
78NaNIndiana
\n", - "
" - ], - "text/plain": [ - " customer_id product state\n", - "0 1 Oven NaN\n", - "1 2 Oven California\n", - "2 3 Oven NaN\n", - "3 4 Television California\n", - "4 5 Television NaN\n", - "5 6 Television Texas\n", - "6 7 NaN New York\n", - "7 8 NaN Indiana" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "outer_join_df = pd.merge(customer_prod_df, customer_state_df, on='customer_id', how='outer')\n", - "outer_join_df" - ] - }, - { - "cell_type": "markdown", - "id": "5ff183fa", - "metadata": {}, - "source": [ - "* 左连接\n", - "\n", - "左侧表的数据都被保留,如果右侧表有缺失,填充 `NaN`。" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "ad7e0314", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:28.992230Z", - "iopub.status.busy": "2023-09-18T00:21:28.991689Z", - "iopub.status.idle": "2023-09-18T00:21:29.005544Z", - "shell.execute_reply": "2023-09-18T00:21:29.004080Z" - } - }, - "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", - "
customer_idproductstate
01OvenNaN
12OvenCalifornia
23OvenNaN
34TelevisionCalifornia
45TelevisionNaN
56TelevisionTexas
\n", - "
" - ], - "text/plain": [ - " customer_id product state\n", - "0 1 Oven NaN\n", - "1 2 Oven California\n", - "2 3 Oven NaN\n", - "3 4 Television California\n", - "4 5 Television NaN\n", - "5 6 Television Texas" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "left_join_df= pd.merge(customer_prod_df, customer_state_df, on='customer_id', how='left')\n", - "left_join_df" - ] - }, - { - "cell_type": "markdown", - "id": "1f6b36ec", - "metadata": {}, - "source": [ - "* 右连接\n", - "\n", - "右侧表的数据都被保留,如果左侧表有缺失,填充 `NaN`。" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "6b83a77d", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:29.012252Z", - "iopub.status.busy": "2023-09-18T00:21:29.011788Z", - "iopub.status.idle": "2023-09-18T00:21:29.029078Z", - "shell.execute_reply": "2023-09-18T00:21:29.027143Z" - } - }, - "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", - "
customer_idproductstate
02OvenCalifornia
14TelevisionCalifornia
26TelevisionTexas
37NaNNew York
48NaNIndiana
\n", - "
" - ], - "text/plain": [ - " customer_id product state\n", - "0 2 Oven California\n", - "1 4 Television California\n", - "2 6 Television Texas\n", - "3 7 NaN New York\n", - "4 8 NaN Indiana" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "right_join_df= pd.merge(customer_prod_df, customer_state_df, on='customer_id', how='right')\n", - "right_join_df" - ] - }, - { - "cell_type": "markdown", - "id": "71de8bff", - "metadata": {}, - "source": [ - "### 其他合并方式\n", - "\n", - "还有一些其他合并,不是根据 key 去在左右表中查找。比如,根据 `DataFrame` 最左侧的 index 列。`DataFrame` 默认有 index 列,根据该列合并两个表,由于此时不是根据 `customer_id` 来合并,合并之后保留了两个 `customer_id`,为了区别左右两表的 `customer_id`,这里加了后缀 `_x` 和 `_y`。" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "469b740a", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:29.034598Z", - "iopub.status.busy": "2023-09-18T00:21:29.034154Z", - "iopub.status.idle": "2023-09-18T00:21:29.048944Z", - "shell.execute_reply": "2023-09-18T00:21:29.047603Z" - } - }, - "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", - "
customer_id_xproductcustomer_id_ystate
01Oven2California
12Oven4California
23Oven6Texas
34Television7New York
45Television8Indiana
\n", - "
" - ], - "text/plain": [ - " customer_id_x product customer_id_y state\n", - "0 1 Oven 2 California\n", - "1 2 Oven 4 California\n", - "2 3 Oven 6 Texas\n", - "3 4 Television 7 New York\n", - "4 5 Television 8 Indiana" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "index_df = pd.merge(customer_prod_df, customer_state_df, right_index=True, left_index=True)\n", - "index_df" - ] - }, - { - "cell_type": "markdown", - "id": "bb52359b", - "metadata": {}, - "source": [ - "## concat\n", - "\n", - "与 `merge()` 对表结构进行横向的操作不同,`concat()` 函数默认是进行纵向的合并,也就是将多行进行 **堆叠式** 的合并,如 {numref}`concat-img` 所示。\n", - "\n", - "```{figure} ../img/ch-pandas/concat.svg\n", - "---\n", - "width: 600px\n", - "name: concat-img\n", - "---\n", - "对两个 DataFrame 进行 concat 操作\n", - "```\n", - "\n", - "比如下面的例子,把所有的行和所有的列合并在一起,缺失的填充 `NaN`。" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "6fe73704", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:29.054777Z", - "iopub.status.busy": "2023-09-18T00:21:29.054244Z", - "iopub.status.idle": "2023-09-18T00:21:29.073028Z", - "shell.execute_reply": "2023-09-18T00:21:29.071342Z" - } - }, - "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", - "
customer_idproductstate
01OvenNaN
12OvenNaN
23OvenNaN
34TelevisionNaN
45TelevisionNaN
56TelevisionNaN
02NaNCalifornia
14NaNCalifornia
26NaNTexas
37NaNNew York
48NaNIndiana
\n", - "
" - ], - "text/plain": [ - " customer_id product state\n", - "0 1 Oven NaN\n", - "1 2 Oven NaN\n", - "2 3 Oven NaN\n", - "3 4 Television NaN\n", - "4 5 Television NaN\n", - "5 6 Television NaN\n", - "0 2 NaN California\n", - "1 4 NaN California\n", - "2 6 NaN Texas\n", - "3 7 NaN New York\n", - "4 8 NaN Indiana" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "row_concat_df = pd.concat([customer_prod_df, customer_state_df])\n", - "row_concat_df" - ] - }, - { - "cell_type": "markdown", - "id": "7732a2fb", - "metadata": {}, - "source": [ - "下面的例子,设定了 `join=\"inner\"`,两个表中都包含 `customer_id` 字段进行了纵向合并。需要注意的是,`concat` 是进行纵向的堆叠,而没有去除重复的 `customer_id`。" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "d04c4d9a", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:29.082931Z", - "iopub.status.busy": "2023-09-18T00:21:29.082240Z", - "iopub.status.idle": "2023-09-18T00:21:29.101471Z", - "shell.execute_reply": "2023-09-18T00:21:29.099100Z" - } - }, - "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", - "
customer_id
01
12
23
34
45
56
02
14
26
37
48
\n", - "
" - ], - "text/plain": [ - " customer_id\n", - "0 1\n", - "1 2\n", - "2 3\n", - "3 4\n", - "4 5\n", - "5 6\n", - "0 2\n", - "1 4\n", - "2 6\n", - "3 7\n", - "4 8" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "concat_inner_df = pd.concat([customer_prod_df, customer_state_df], join = 'inner')\n", - "concat_inner_df" - ] - }, - { - "cell_type": "markdown", - "id": "94b421dd", - "metadata": {}, - "source": [ - "## 案例:学生成绩\n", - "\n", - "我们使用一个学生成绩的案例来演示如何对两个 `DataFrame` 进行 `merge`。" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "ba2002fd", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:29.111913Z", - "iopub.status.busy": "2023-09-18T00:21:29.110565Z", - "iopub.status.idle": "2023-09-18T00:21:29.123036Z", - "shell.execute_reply": "2023-09-18T00:21:29.120657Z" - }, - "tags": [ - "hide-cell" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "文件夹已存在,无需操作。\n" - ] - } - ], - "source": [ - "import urllib.request\n", - "import os\n", - "import pandas as pd\n", - "\n", - "download_url_prefix = \"https://godaai.github.io/python-data-science/datasets/student-score\"\n", - "folder_path = os.path.join(os.getcwd(), \"../data/student-score\")\n", - "score_download_url = f\"{download_url_prefix}/score.csv\"\n", - "student_attr_download_url = f\"{download_url_prefix}/student.csv\"\n", - "\n", - "score_file_name = score_download_url.split(\"/\")[-1]\n", - "student_file_name = student_attr_download_url.split(\"/\")[-1]\n", - "score_path = os.path.join(folder_path, score_file_name)\n", - "student_path = os.path.join(folder_path, student_file_name)\n", - "\n", - "if not os.path.exists(folder_path):\n", - " # 创建文件夹\n", - " os.makedirs(folder_path)\n", - " print(f\"文件夹不存在,已创建。\")\n", - "\n", - " urllib.request.urlretrieve(score_download_url, score_path)\n", - " urllib.request.urlretrieve(student_attr_download_url, student_path)\n", - " print(\"数据已下载。\")\n", - "else:\n", - " print(f\"文件夹已存在,无需操作。\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "59f360b8", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:29.131991Z", - "iopub.status.busy": "2023-09-18T00:21:29.130505Z", - "iopub.status.idle": "2023-09-18T00:21:29.161236Z", - "shell.execute_reply": "2023-09-18T00:21:29.159685Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "student DF:\n", - "shape of this DF: (44, 7)\n", - "the first 2 rows of this DF:\n" - ] - }, - { - "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", - "
snosnamesexdeptmajorclaasnohome_address
02019101101张元信息学院计算机1北京市
12019101102李玲信息学院计算机1天津市
\n", - "
" - ], - "text/plain": [ - " sno sname sex dept major claasno home_address\n", - "0 2019101101 张元 男 信息学院 计算机 1 北京市\n", - "1 2019101102 李玲 女 信息学院 计算机 1 天津市" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print(\"student DF:\")\n", - "student_df = pd.read_csv(student_path, encoding = \"UTF-8\")\n", - "print(f\"shape of this DF: {student_df.shape}\")\n", - "print(\"the first 2 rows of this DF:\")\n", - "student_df.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "9e55dc36", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:29.166773Z", - "iopub.status.busy": "2023-09-18T00:21:29.166234Z", - "iopub.status.idle": "2023-09-18T00:21:29.188574Z", - "shell.execute_reply": "2023-09-18T00:21:29.185874Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "score DF:\n", - "Shape of this DF: (43, 4)\n", - "the first 2 rows of this DF:\n" - ] - }, - { - "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", - "
snocnocnamescore
02019101103E202宏观经济78
12019102105E202宏观经济97
\n", - "
" - ], - "text/plain": [ - " sno cno cname score\n", - "0 2019101103 E202 宏观经济 78\n", - "1 2019102105 E202 宏观经济 97" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print(\"score DF:\")\n", - "score_df = pd.read_csv(score_path, encoding = \"UTF-8\")\n", - "print(f\"Shape of this DF: {score_df.shape}\")\n", - "print(\"the first 2 rows of this DF:\")\n", - "score_df.head(2)" - ] - }, - { - "cell_type": "markdown", - "id": "0abd0436", - "metadata": {}, - "source": [ - "可以看到两个表都包含了 `sno`,也就是学号,可以使用学号作为 key 进行合并。" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "e14eccc0", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-18T00:21:29.196566Z", - "iopub.status.busy": "2023-09-18T00:21:29.195187Z", - "iopub.status.idle": "2023-09-18T00:21:29.237552Z", - "shell.execute_reply": "2023-09-18T00:21:29.236024Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "shape of this DF: (44, 10)\n", - "the first 2 rows:\n" - ] - }, - { - "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", - "
snosnamesexdeptmajorclaasnohome_addresscnocnamescore
02019101101张元信息学院计算机1北京市CS101程序设计89.0
12019101102李玲信息学院计算机1天津市CS203数据结构与算法80.0
\n", - "
" - ], - "text/plain": [ - " sno sname sex dept major claasno home_address cno cname \\\n", - "0 2019101101 张元 男 信息学院 计算机 1 北京市 CS101 程序设计 \n", - "1 2019101102 李玲 女 信息学院 计算机 1 天津市 CS203 数据结构与算法 \n", - "\n", - " score \n", - "0 89.0 \n", - "1 80.0 " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "merged_df = pd.merge(left = student_df, right = score_df, how = 'left', on = 'sno')\n", - "print(f\"shape of this DF: {merged_df.shape}\")\n", - "print(\"the first 2 rows:\")\n", - "merged_df.head(2)" - ] - }, - { - "cell_type": "markdown", - "id": "d38f8d62", - "metadata": {}, - "source": [ - "关于合并后的新表,列数一共10列。`student_df` 一共7列, `score_df` 一共4列,即:7 + 4 - 1,因为两个表都包含同样的一列 `sno`,所以需要减一。\n", - "\n", - "我们使用的是 `how='left'` 的方式进行的合并。行数一共44,这与 `student_df` 的列数一致。我们打印完整合并后的新表,可以发现,在`student_df`中包含但 `score_df` 中不包含的成绩相关的信息显示 NaN。\n", - "\n", - "接下来我们就可以使用各类其他分析方式,对这个新的大表进行数据分析,这里不再赘述。" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/_sources/ch-pandas/dataframe-pivot-melt.ipynb b/docs/_sources/ch-pandas/dataframe-pivot-melt.ipynb deleted file mode 100644 index 100727cb..00000000 --- a/docs/_sources/ch-pandas/dataframe-pivot-melt.ipynb +++ /dev/null @@ -1,1990 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 数据透视\n", - "\n", - "`pivot()` 和 `melt()` 是一对互逆的操作,能提供类似 Excel 数据透视表这样的功能。\n", - "\n", - "## pivot\n", - "\n", - "在使用 Excel 这样的表格时,一个高阶的操作是使用“数据透视表”对数据进行分类汇总。pandas 的 `pivot()` 提供与 Excel 对应的数据透视的功能,它根据一个或多个列的值对数据进行重新排列和汇总,以便更好地理解数据的结构和关系。`pivot()` 能够可自定义函数进行聚合,因此功能更强大。\n", - "\n", - "{numref}`pivot-img` 是一个数据透视的示意图,下文还将展示具体的例子。\n", - "\n", - "```{figure} ../img/ch-pandas/pivot.svg\n", - "---\n", - "width: 600px\n", - "name: pivot-img\n", - "---\n", - "数据透视\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "tags": [ - "hide cell", - "hide-cell" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "文件夹已存在,无需操作。\n" - ] - } - ], - "source": [ - "import urllib.request\n", - "import os\n", - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "download_url_prefix = \"https://godaai.github.io/python-data-science/datasets/sales\"\n", - "folder_path = os.path.join(os.getcwd(), \"../data/sales\")\n", - "download_url = f\"{download_url_prefix}/sales.csv\"\n", - "\n", - "file_name = download_url.split(\"/\")[-1]\n", - "file_path = os.path.join(folder_path, file_name)\n", - "\n", - "if not os.path.exists(folder_path):\n", - " # 创建文件夹\n", - " os.makedirs(folder_path)\n", - " print(f\"文件夹不存在,已创建。\")\n", - "\n", - " urllib.request.urlretrieve(download_url, file_path)\n", - " print(\"数据已下载。\")\n", - "else:\n", - " print(f\"文件夹已存在,无需操作。\")" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AccountNameRepManagerProductQuantityPriceStatus
0714466Trantow-BarrowsCraig BookerDebra HenleyCPU130000presented
1714466Trantow-BarrowsCraig BookerDebra HenleySoftware110000presented
2714466Trantow-BarrowsCraig BookerDebra HenleyMaintenance25000pending
3737550Fritsch, Russel and AndersonCraig BookerDebra HenleyCPU135000declined
4146832Kiehn-SpinkaDaniel HiltonDebra HenleyCPU265000won
5218895Kulas IncDaniel HiltonDebra HenleyCPU240000pending
6218895Kulas IncDaniel HiltonDebra HenleySoftware110000presented
7412290Jerde-HilpertJohn SmithDebra HenleyMaintenance25000pending
8740150Barton LLCJohn SmithDebra HenleyCPU135000declined
9141962Herman LLCCedric MossFred AndersonCPU265000won
10163416Purdy-KundeCedric MossFred AndersonCPU130000presented
11239344Stokes LLCCedric MossFred AndersonMaintenance15000pending
12239344Stokes LLCCedric MossFred AndersonSoftware110000presented
13307599Kassulke, Ondricka and MetzWendy YuleFred AndersonMaintenance37000won
14688981Keeling LLCWendy YuleFred AndersonCPU5100000won
15729833Koepp LtdWendy YuleFred AndersonCPU265000declined
16729833Koepp LtdWendy YuleFred AndersonMonitor25000presented
\n", - "
" - ], - "text/plain": [ - " Account Name Rep Manager \\\n", - "0 714466 Trantow-Barrows Craig Booker Debra Henley \n", - "1 714466 Trantow-Barrows Craig Booker Debra Henley \n", - "2 714466 Trantow-Barrows Craig Booker Debra Henley \n", - "3 737550 Fritsch, Russel and Anderson Craig Booker Debra Henley \n", - "4 146832 Kiehn-Spinka Daniel Hilton Debra Henley \n", - "5 218895 Kulas Inc Daniel Hilton Debra Henley \n", - "6 218895 Kulas Inc Daniel Hilton Debra Henley \n", - "7 412290 Jerde-Hilpert John Smith Debra Henley \n", - "8 740150 Barton LLC John Smith Debra Henley \n", - "9 141962 Herman LLC Cedric Moss Fred Anderson \n", - "10 163416 Purdy-Kunde Cedric Moss Fred Anderson \n", - "11 239344 Stokes LLC Cedric Moss Fred Anderson \n", - "12 239344 Stokes LLC Cedric Moss Fred Anderson \n", - "13 307599 Kassulke, Ondricka and Metz Wendy Yule Fred Anderson \n", - "14 688981 Keeling LLC Wendy Yule Fred Anderson \n", - "15 729833 Koepp Ltd Wendy Yule Fred Anderson \n", - "16 729833 Koepp Ltd Wendy Yule Fred Anderson \n", - "\n", - " Product Quantity Price Status \n", - "0 CPU 1 30000 presented \n", - "1 Software 1 10000 presented \n", - "2 Maintenance 2 5000 pending \n", - "3 CPU 1 35000 declined \n", - "4 CPU 2 65000 won \n", - "5 CPU 2 40000 pending \n", - "6 Software 1 10000 presented \n", - "7 Maintenance 2 5000 pending \n", - "8 CPU 1 35000 declined \n", - "9 CPU 2 65000 won \n", - "10 CPU 1 30000 presented \n", - "11 Maintenance 1 5000 pending \n", - "12 Software 1 10000 presented \n", - "13 Maintenance 3 7000 won \n", - "14 CPU 5 100000 won \n", - "15 CPU 2 65000 declined \n", - "16 Monitor 2 5000 presented " - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sales_df = pd.read_csv(file_path)\n", - "sales_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "具体而言,pandas 有两个函数:`pivot()` 和 `pivot_table()`,其中 `pivot_table()` 更像 Excel 的数据透视表。\n", - "\n", - "`pivot_table()` 函数的完整形式为 `pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)` 。参数很多,只有 `data` 是唯一必需的参数,其他均有默认值,常需要设置的参数有 `values`, `index`, `columns`,`aggfunc` 等。我们先从简单的开始。\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### index 和 columns 参数\n", - "\n", - "`index` 和 `columns` 接收的都是字段名,它们都可用于分组。\n", - "\n", - "- `index` 生成透视表的行索引,可以为多个属性。\n", - "\n", - "- `columns` 生成透视表的列索引。\n", - "\n", - "例 1: 按照 Name 分组,即添加 Name 的行索引。这个功能与 `groupby()` 很像。这个例子中,`aggfunc` 参数没有设置,默认求平均值。" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "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", - "
PriceQuantity
Name
Barton LLC35000.01.000000
Fritsch, Russel and Anderson35000.01.000000
Herman LLC65000.02.000000
Jerde-Hilpert5000.02.000000
Kassulke, Ondricka and Metz7000.03.000000
Keeling LLC100000.05.000000
Kiehn-Spinka65000.02.000000
Koepp Ltd35000.02.000000
Kulas Inc25000.01.500000
Purdy-Kunde30000.01.000000
Stokes LLC7500.01.000000
Trantow-Barrows15000.01.333333
\n", - "
" - ], - "text/plain": [ - " Price Quantity\n", - "Name \n", - "Barton LLC 35000.0 1.000000\n", - "Fritsch, Russel and Anderson 35000.0 1.000000\n", - "Herman LLC 65000.0 2.000000\n", - "Jerde-Hilpert 5000.0 2.000000\n", - "Kassulke, Ondricka and Metz 7000.0 3.000000\n", - "Keeling LLC 100000.0 5.000000\n", - "Kiehn-Spinka 65000.0 2.000000\n", - "Koepp Ltd 35000.0 2.000000\n", - "Kulas Inc 25000.0 1.500000\n", - "Purdy-Kunde 30000.0 1.000000\n", - "Stokes LLC 7500.0 1.000000\n", - "Trantow-Barrows 15000.0 1.333333" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.pivot_table(sales_df, index=['Name'], values=['Quantity', 'Price'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "例 2: 按 Manager 和 Rep 分组,类似于使用 `groupby()` 对两个字段 Manager 和 Rep 进行分组。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "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", - "
PriceQuantity
ManagerRep
Debra HenleyCraig Booker20000.0000001.250000
Daniel Hilton38333.3333331.666667
John Smith20000.0000001.500000
Fred AndersonCedric Moss27500.0000001.250000
Wendy Yule44250.0000003.000000
\n", - "
" - ], - "text/plain": [ - " Price Quantity\n", - "Manager Rep \n", - "Debra Henley Craig Booker 20000.000000 1.250000\n", - " Daniel Hilton 38333.333333 1.666667\n", - " John Smith 20000.000000 1.500000\n", - "Fred Anderson Cedric Moss 27500.000000 1.250000\n", - " Wendy Yule 44250.000000 3.000000" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.pivot_table(sales_df, index=['Manager', 'Rep'], values=['Quantity', 'Price'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "前面两个例子与 `groupby` 很像,第 3 个例子,增加 `columns` 这个参数,添加透视表的列 Product,把原来存在于 Product 中的数据作为列名提出来。" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "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", - "
PriceQuantity
ProductCPUMaintenanceMonitorSoftwareCPUMaintenanceMonitorSoftware
ManagerRep
Debra HenleyCraig Booker32500.05000.0NaN10000.01.02.0NaN1.0
Daniel Hilton52500.0NaNNaN10000.02.0NaNNaN1.0
John Smith35000.05000.0NaNNaN1.02.0NaNNaN
Fred AndersonCedric Moss47500.05000.0NaN10000.01.51.0NaN1.0
Wendy Yule82500.07000.05000.0NaN3.53.02.0NaN
\n", - "
" - ], - "text/plain": [ - " Price Quantity \\\n", - "Product CPU Maintenance Monitor Software CPU \n", - "Manager Rep \n", - "Debra Henley Craig Booker 32500.0 5000.0 NaN 10000.0 1.0 \n", - " Daniel Hilton 52500.0 NaN NaN 10000.0 2.0 \n", - " John Smith 35000.0 5000.0 NaN NaN 1.0 \n", - "Fred Anderson Cedric Moss 47500.0 5000.0 NaN 10000.0 1.5 \n", - " Wendy Yule 82500.0 7000.0 5000.0 NaN 3.5 \n", - "\n", - " \n", - "Product Maintenance Monitor Software \n", - "Manager Rep \n", - "Debra Henley Craig Booker 2.0 NaN 1.0 \n", - " Daniel Hilton NaN NaN 1.0 \n", - " John Smith 2.0 NaN NaN \n", - "Fred Anderson Cedric Moss 1.0 NaN 1.0 \n", - " Wendy Yule 3.0 2.0 NaN " - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.pivot_table(sales_df, index=['Manager','Rep'], values=['Quantity', 'Price'], columns=[\"Product\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "生成的数据透视表有两层列索引,第一层是原有的 Price、Quantity 这些字段,第二层是 `columns=[\"Product\"]` 里面的值:CPU、Monitor 等。" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### values 参数\n", - "\n", - "`values` 参数指明要聚合的列或列的列表,通常是你想要在透视表中分析的数值数据。\n", - "\n", - "例 4:只显示 Price 列对应的平均值。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "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", - "
Price
ManagerRep
Debra HenleyCraig Booker20000.000000
Daniel Hilton38333.333333
John Smith20000.000000
Fred AndersonCedric Moss27500.000000
Wendy Yule44250.000000
\n", - "
" - ], - "text/plain": [ - " Price\n", - "Manager Rep \n", - "Debra Henley Craig Booker 20000.000000\n", - " Daniel Hilton 38333.333333\n", - " John Smith 20000.000000\n", - "Fred Anderson Cedric Moss 27500.000000\n", - " Wendy Yule 44250.000000" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.pivot_table(sales_df, index=['Manager','Rep'], values='Price')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### aggfunc 参数\n", - "\n", - "用于汇总数据的聚合函数,可以是字符串(如'sum'、'mean'、'count' 等预置函数)或自定义聚合函数。\n", - "\n", - "例:对 Price 显示 `mean` 和 `len` 两列结果。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "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", - "
meanlen
PricePrice
ManagerRep
Debra HenleyCraig Booker20000.0000004
Daniel Hilton38333.3333333
John Smith20000.0000002
Fred AndersonCedric Moss27500.0000004
Wendy Yule44250.0000004
\n", - "
" - ], - "text/plain": [ - " mean len\n", - " Price Price\n", - "Manager Rep \n", - "Debra Henley Craig Booker 20000.000000 4\n", - " Daniel Hilton 38333.333333 3\n", - " John Smith 20000.000000 2\n", - "Fred Anderson Cedric Moss 27500.000000 4\n", - " Wendy Yule 44250.000000 4" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.pivot_table(sales_df, index=[\"Manager\",\"Rep\"], values=[\"Price\"], aggfunc=[\"mean\", len])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### fill_value 和 margins 参数\n", - "\n", - "`fill_value` 参数用于填充缺失值的值。`margins` 参数为布尔值,如果为 True, 则在透视表中包含行和列的总计。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/4n/v40br47s46ggrjm9bdm64lwh0000gn/T/ipykernel_34035/3052684454.py:1: FutureWarning: The provided callable is currently using DataFrameGroupBy.sum. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string \"sum\" instead.\n", - " pd.pivot_table(sales_df,index=[\"Manager\",\"Rep\",\"Product\"],\n", - "/var/folders/4n/v40br47s46ggrjm9bdm64lwh0000gn/T/ipykernel_34035/3052684454.py:1: FutureWarning: The provided callable is currently using DataFrameGroupBy.mean. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string \"mean\" instead.\n", - " pd.pivot_table(sales_df,index=[\"Manager\",\"Rep\",\"Product\"],\n" - ] - }, - { - "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", - "
summean
PriceQuantityPriceQuantity
ManagerRepProduct
Debra HenleyCraig BookerCPU65000232500.0000001.000000
Maintenance500025000.0000002.000000
Software10000110000.0000001.000000
Daniel HiltonCPU105000452500.0000002.000000
Software10000110000.0000001.000000
John SmithCPU35000135000.0000001.000000
Maintenance500025000.0000002.000000
Fred AndersonCedric MossCPU95000347500.0000001.500000
Maintenance500015000.0000001.000000
Software10000110000.0000001.000000
Wendy YuleCPU165000782500.0000003.500000
Maintenance700037000.0000003.000000
Monitor500025000.0000002.000000
All5220003030705.8823531.764706
\n", - "
" - ], - "text/plain": [ - " sum mean \\\n", - " Price Quantity Price \n", - "Manager Rep Product \n", - "Debra Henley Craig Booker CPU 65000 2 32500.000000 \n", - " Maintenance 5000 2 5000.000000 \n", - " Software 10000 1 10000.000000 \n", - " Daniel Hilton CPU 105000 4 52500.000000 \n", - " Software 10000 1 10000.000000 \n", - " John Smith CPU 35000 1 35000.000000 \n", - " Maintenance 5000 2 5000.000000 \n", - "Fred Anderson Cedric Moss CPU 95000 3 47500.000000 \n", - " Maintenance 5000 1 5000.000000 \n", - " Software 10000 1 10000.000000 \n", - " Wendy Yule CPU 165000 7 82500.000000 \n", - " Maintenance 7000 3 7000.000000 \n", - " Monitor 5000 2 5000.000000 \n", - "All 522000 30 30705.882353 \n", - "\n", - " \n", - " Quantity \n", - "Manager Rep Product \n", - "Debra Henley Craig Booker CPU 1.000000 \n", - " Maintenance 2.000000 \n", - " Software 1.000000 \n", - " Daniel Hilton CPU 2.000000 \n", - " Software 1.000000 \n", - " John Smith CPU 1.000000 \n", - " Maintenance 2.000000 \n", - "Fred Anderson Cedric Moss CPU 1.500000 \n", - " Maintenance 1.000000 \n", - " Software 1.000000 \n", - " Wendy Yule CPU 3.500000 \n", - " Maintenance 3.000000 \n", - " Monitor 2.000000 \n", - "All 1.764706 " - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.pivot_table(sales_df,index=[\"Manager\",\"Rep\",\"Product\"],\n", - " values=[\"Price\",\"Quantity\"],\n", - " aggfunc=[np.sum,np.mean], fill_value=0, margins=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 维度交叉\n", - "\n", - "将以上参数结合起来,对 Quantity 和 Price 应用不同的聚合函数。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/4n/v40br47s46ggrjm9bdm64lwh0000gn/T/ipykernel_34035/1669582107.py:1: FutureWarning: The provided callable is currently using SeriesGroupBy.mean. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string \"mean\" instead.\n", - " table = pd.pivot_table(sales_df,\n" - ] - }, - { - "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", - "
PriceQuantity
meanlen
ProductCPUMaintenanceMonitorSoftwareCPUMaintenanceMonitorSoftware
ManagerStatus
Debra Henleydeclined35000.00.00.00.02000
pending40000.05000.00.00.01200
presented30000.00.00.010000.01002
won65000.00.00.00.01000
Fred Andersondeclined65000.00.00.00.01000
pending0.05000.00.00.00100
presented30000.00.05000.010000.01011
won82500.07000.00.00.02100
\n", - "
" - ], - "text/plain": [ - " Price Quantity \\\n", - " mean len \n", - "Product CPU Maintenance Monitor Software CPU \n", - "Manager Status \n", - "Debra Henley declined 35000.0 0.0 0.0 0.0 2 \n", - " pending 40000.0 5000.0 0.0 0.0 1 \n", - " presented 30000.0 0.0 0.0 10000.0 1 \n", - " won 65000.0 0.0 0.0 0.0 1 \n", - "Fred Anderson declined 65000.0 0.0 0.0 0.0 1 \n", - " pending 0.0 5000.0 0.0 0.0 0 \n", - " presented 30000.0 0.0 5000.0 10000.0 1 \n", - " won 82500.0 7000.0 0.0 0.0 2 \n", - "\n", - " \n", - " \n", - "Product Maintenance Monitor Software \n", - "Manager Status \n", - "Debra Henley declined 0 0 0 \n", - " pending 2 0 0 \n", - " presented 0 0 2 \n", - " won 0 0 0 \n", - "Fred Anderson declined 0 0 0 \n", - " pending 1 0 0 \n", - " presented 0 1 1 \n", - " won 1 0 0 " - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table = pd.pivot_table(sales_df,\n", - " index=[\"Manager\",\"Status\"],\n", - " columns=[\"Product\"],\n", - " values=[\"Quantity\",\"Price\"],\n", - " aggfunc={\"Quantity\":len, \"Price\":[np.mean]},\n", - " fill_value=0)\n", - "table" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 数据筛选\n", - "\n", - "建立数据透视表(pivot table)后,也可以进一步筛选数据以满足特定的条件,类似于 DataFrame 的数据切片方法中的条件索引。这里主要介绍 `query()` 函数,通过传递查询字符串来筛选数据。\n", - "\n", - "例 1: 筛选出 Manager 为 Debra Henley 的结果。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "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", - "
PriceQuantity
meanlen
ProductCPUMaintenanceMonitorSoftwareCPUMaintenanceMonitorSoftware
ManagerStatus
Debra Henleydeclined35000.00.00.00.02000
pending40000.05000.00.00.01200
presented30000.00.00.010000.01002
won65000.00.00.00.01000
\n", - "
" - ], - "text/plain": [ - " Price Quantity \\\n", - " mean len \n", - "Product CPU Maintenance Monitor Software CPU \n", - "Manager Status \n", - "Debra Henley declined 35000.0 0.0 0.0 0.0 2 \n", - " pending 40000.0 5000.0 0.0 0.0 1 \n", - " presented 30000.0 0.0 0.0 10000.0 1 \n", - " won 65000.0 0.0 0.0 0.0 1 \n", - "\n", - " \n", - " \n", - "Product Maintenance Monitor Software \n", - "Manager Status \n", - "Debra Henley declined 0 0 0 \n", - " pending 2 0 0 \n", - " presented 0 0 2 \n", - " won 0 0 0 " - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table.query('Manager == [\"Debra Henley\"]')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "例 2: 筛选出 Status 为 pending 或 won 的结果。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "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", - "
PriceQuantity
meanlen
ProductCPUMaintenanceMonitorSoftwareCPUMaintenanceMonitorSoftware
ManagerStatus
Debra Henleypending40000.05000.00.00.01200
won65000.00.00.00.01000
Fred Andersonpending0.05000.00.00.00100
won82500.07000.00.00.02100
\n", - "
" - ], - "text/plain": [ - " Price Quantity \\\n", - " mean len \n", - "Product CPU Maintenance Monitor Software CPU \n", - "Manager Status \n", - "Debra Henley pending 40000.0 5000.0 0.0 0.0 1 \n", - " won 65000.0 0.0 0.0 0.0 1 \n", - "Fred Anderson pending 0.0 5000.0 0.0 0.0 0 \n", - " won 82500.0 7000.0 0.0 0.0 2 \n", - "\n", - " \n", - " \n", - "Product Maintenance Monitor Software \n", - "Manager Status \n", - "Debra Henley pending 2 0 0 \n", - " won 0 0 0 \n", - "Fred Anderson pending 1 0 0 \n", - " won 1 0 0 " - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table.query('Status == [\"pending\",\"won\"]')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## melt\n", - "\n", - "`melt()` 是用于将一个很宽的的表转换为长。这个函数通常用于数据重塑(data reshaping)操作,以便更容易进行数据分析和可视化。根据其英文名,又可被理解成,将一个宽表,“融化”成一个长表。通过这种方式,可以将宽格式数据表格中的多列数据整合到一个列中,可以理解为透视表 `pivot_table()` 的反操作。" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "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", - "
Student_idNameMathEnglishHistory
01Amy908588
12Bob789276
23John887990
\n", - "
" - ], - "text/plain": [ - " Student_id Name Math English History\n", - "0 1 Amy 90 85 88\n", - "1 2 Bob 78 92 76\n", - "2 3 John 88 79 90" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d1 = {\n", - " 'Student_id': pd.Series([1, 2, 3]), \n", - " 'Name': pd.Series(['Amy', 'Bob', 'John']), \n", - " 'Math': pd.Series([90, 78, 88]),\n", - " 'English':pd.Series([85, 92, 79]),\n", - " 'History':pd.Series([88, 76, 90])\n", - "}\n", - "student_df = pd.DataFrame(d1)\n", - "student_df" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "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", - "
Student_idNameSubjectScore
01AmyMath90
12BobMath78
23JohnMath88
31AmyEnglish85
42BobEnglish92
53JohnEnglish79
61AmyHistory88
72BobHistory76
83JohnHistory90
\n", - "
" - ], - "text/plain": [ - " Student_id Name Subject Score\n", - "0 1 Amy Math 90\n", - "1 2 Bob Math 78\n", - "2 3 John Math 88\n", - "3 1 Amy English 85\n", - "4 2 Bob English 92\n", - "5 3 John English 79\n", - "6 1 Amy History 88\n", - "7 2 Bob History 76\n", - "8 3 John History 90" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "melted_df = pd.melt(student_df, \n", - " id_vars=['Student_id', 'Name'], \n", - " value_vars=['Math', 'English', 'History'], \n", - " var_name='Subject', \n", - " value_name='Score')\n", - "melted_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "数据重塑时,通常需要使用 `value_vars` 来指定需要 “融化” 的列,使它们被整合为一列。比如本例中,将 Math, English,History 整合为一列: Subject 列。\n", - "\n", - "```{figure} ../img/ch-pandas/melt.svg\n", - "---\n", - "width: 500px\n", - "name: melt-img\n", - "---\n", - "melt(): 数据融化\n", - "```\n", - "\n", - "我们回到 `melt()` 函数的参数。完整的参数形式为:`pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)`。\n", - "\n", - "- `frame` 指的是要进行重塑操作的 DataFrame 。\n", - "\n", - "- `id_vars` 表示需要保留的列,它们将成为长表中的行;这些列又被称为标识变量(identifier variable),不被融化。\n", - "\n", - "- `value_vars` 是需要融化的列,它们将被整合成一列,并用新的列名表示。\n", - "\n", - "- `var_name` 用于存储融化后的列名的新列的名称。\n", - "\n", - "- `value_name` 用于存储融化后的值的新列的名称。\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "git", - "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.10.13" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_sources/ch-pandas/dataframe-slicing.ipynb b/docs/_sources/ch-pandas/dataframe-slicing.ipynb deleted file mode 100644 index 950dc164..00000000 --- a/docs/_sources/ch-pandas/dataframe-slicing.ipynb +++ /dev/null @@ -1,2493 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "a5475877", - "metadata": {}, - "source": [ - "# 数据切片\n", - "\n", - "实际中,我们常常不是分析整个数据,而是数据中的部分子集。即 {numref}`slicing-img` 中的转化。本节主要介绍如何根据特定的条件获得所需要的数据。\n", - "\n", - "```{figure} ../img/ch-pandas/slicing.svg\n", - "---\n", - "width: 600px\n", - "name: slicing-img\n", - "---\n", - "数据切片\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "bf826f06", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:34.456561Z", - "iopub.status.busy": "2023-09-11T14:28:34.456141Z", - "iopub.status.idle": "2023-09-11T14:28:35.515803Z", - "shell.execute_reply": "2023-09-11T14:28:35.515056Z" - }, - "tags": [ - "hide-cell" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "文件夹已存在,无需操作。\n" - ] - } - ], - "source": [ - "import os\n", - "import urllib.request\n", - "import zipfile\n", - "import pandas as pd\n", - "\n", - "folder_path = os.path.join(os.getcwd(), \"../data/pwt\")\n", - "download_url = \"https://www.rug.nl/ggdc/docs/pwt70_06032011version.zip\"\n", - "file_name = download_url.split(\"/\")[-1]\n", - "if not os.path.exists(folder_path):\n", - " # 创建文件夹\n", - " os.makedirs(folder_path)\n", - " print(f\"文件夹不存在,已创建。\")\n", - "\n", - " zip_file_path = os.path.join(folder_path, file_name)\n", - "\n", - " urllib.request.urlretrieve(download_url, zip_file_path)\n", - " with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:\n", - " zip_ref.extractall(folder_path)\n", - " print(\"数据已下载并解压缩。\")\n", - "else:\n", - " print(f\"文件夹已存在,无需操作。\")\n", - "\n", - "df = pd.read_csv(os.path.join(folder_path, \"pwt70_w_country_names.csv\"))" - ] - }, - { - "cell_type": "markdown", - "id": "be2493ee", - "metadata": {}, - "source": [ - "## 主要方法\n", - "\n", - "对 `DataFrame` 选择行和列,主要有几种方式:\n", - "\n", - "* 使用 `[]` 选择\n", - "* 使用 `.iloc` 或者 `.loc` 函数\n", - "* 使用 `.query` 函数\n", - "\n", - "### 使用 `[]` 进行选择\n", - "- 选择行\n", - "\n", - "直接使用数字索引即可,`df[a,b]`表示选择 `DataFrame` 的第`a`行到第`b-1`行。\n", - "\n", - "```{note}\n", - "Python中的索引区间都是左闭右开区间,这意味着左边端点可以取到,而右边端点取不到。\n", - "```\n", - "\n", - "例:对上一章节的PWT案例数据 df 选择第 2 行到第 5 行(不包括第 5 行)的数据。\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "bb09cc50", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.563007Z", - "iopub.status.busy": "2023-09-11T14:28:35.562603Z", - "iopub.status.idle": "2023-09-11T14:28:35.589737Z", - "shell.execute_reply": "2023-09-11T14:28:35.589093Z" - } - }, - "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", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
2AfghanistanAFG19528425.333NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3AfghanistanAFG19538573.217NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4AfghanistanAFG19548728.408NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "

3 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit ppp tcgdp cgdp \\\n", - "2 Afghanistan AFG 1952 8425.333 NaN NaN NaN NaN NaN \n", - "3 Afghanistan AFG 1953 8573.217 NaN NaN NaN NaN NaN \n", - "4 Afghanistan AFG 1954 8728.408 NaN NaN NaN NaN NaN \n", - "\n", - " cgdp2 ... kg ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te \\\n", - "2 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN \n", - "3 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN \n", - "4 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN \n", - "\n", - " rgdpl2th rgdptt \n", - "2 NaN NaN \n", - "3 NaN NaN \n", - "4 NaN NaN \n", - "\n", - "[3 rows x 37 columns]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[2:5]" - ] - }, - { - "cell_type": "markdown", - "id": "eb81787d", - "metadata": {}, - "source": [ - "- 选择列\n", - "\n", - "我们可以传递一个列表,其中包含所需列的列名,为字符串形式。\n", - "\n", - "例:选择 country 和 tcgdp 两列。" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "fdfc507b", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.593043Z", - "iopub.status.busy": "2023-09-11T14:28:35.592746Z", - "iopub.status.idle": "2023-09-11T14:28:35.603153Z", - "shell.execute_reply": "2023-09-11T14:28:35.602355Z" - } - }, - "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", - "
countrytcgdp
0AfghanistanNaN
1AfghanistanNaN
2AfghanistanNaN
3AfghanistanNaN
4AfghanistanNaN
.........
11395Zimbabwe1968.205961
11396Zimbabwe2132.305773
11397Zimbabwe2107.937100
11398Zimbabwe1772.209867
11399Zimbabwe1906.049843
\n", - "

11400 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " country tcgdp\n", - "0 Afghanistan NaN\n", - "1 Afghanistan NaN\n", - "2 Afghanistan NaN\n", - "3 Afghanistan NaN\n", - "4 Afghanistan NaN\n", - "... ... ...\n", - "11395 Zimbabwe 1968.205961\n", - "11396 Zimbabwe 2132.305773\n", - "11397 Zimbabwe 2107.937100\n", - "11398 Zimbabwe 1772.209867\n", - "11399 Zimbabwe 1906.049843\n", - "\n", - "[11400 rows x 2 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[['country', 'tcgdp']]" - ] - }, - { - "cell_type": "markdown", - "id": "ea5e69d0", - "metadata": {}, - "source": [ - "如果只选取一列,`df['country']` 等价于 `df.country`。\n", - "\n", - "- `[]` 选择符合特定条件的数据。 \n", - "\n", - "例如,选取 POP 大于 20000 的行。判断语句 `df.POP> 20000` 会返回一系列布尔值,符合 POP 大于 20000 条件的会返回为 `True`。如果想要选择这些符合条件的数据,则需要:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "570e6b12", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.607674Z", - "iopub.status.busy": "2023-09-11T14:28:35.607207Z", - "iopub.status.idle": "2023-09-11T14:28:35.633518Z", - "shell.execute_reply": "2023-09-11T14:28:35.632350Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
45AfghanistanAFG199520881.4800.833333Afghani0.3529817640.404208365.893807380.608406...11.96927611.43596364.779503575.7496941427.1609711432.074990NaNNaNNaN450.097562
46AfghanistanAFG199621559.9232.500023Afghani1.0356187541.782643349.805639363.579817...12.40328711.36853072.681765539.9353701339.7730621343.634290NaNNaNNaN422.025786
47AfghanistanAFG199722227.4153.000030Afghani1.2309197420.757993333.856096342.188209...2.09861222.68101857.214244569.2464141414.1796701508.635000NaNNaNNaN388.407429
48AfghanistanAFG199822912.8143.000053Afghani1.2258517203.038357314.367251321.797566...2.15524722.58996462.186846539.2586521340.6278741430.919956NaNNaNNaN363.011141
49AfghanistanAFG199923646.12845.106375Afghani18.1934487053.728453298.303741305.275708...2.16933222.48344867.001174510.5543091270.0435591356.481758NaNNaNNaN339.159330
..................................................................
11275YemenYEM200520345.000195.080000Yemeni Rial69.50111249247.1256102420.6009152445.644456...6.63054130.90831970.7620753152.9878129689.4529139689.452913NaN9376.655609NaN2420.600915
11276YemenYEM200620965.000198.500000Yemeni Rial79.71891451669.1809702464.5447642509.971963...7.62706728.00131477.5133063098.2978439398.2355299540.051028NaN9243.472310NaN2382.182154
11277YemenYEM200721591.000199.540000Yemeni Rial84.65647555761.4285402582.6237112607.372597...8.61635229.29541174.5381053149.6135339432.7631029606.653374NaN9314.041767NaN2417.153583
11278YemenYEM200822223.000200.080000Yemeni Rial95.88995559804.7208302691.1182482708.301212...7.57865426.63583177.7392273154.2382369329.8262569586.031067NaN9295.538992NaN2437.614583
11279YemenYEM200922858.000207.320000Yemeni Rial87.61770061288.8148902681.2851032699.266570...8.43254923.87359166.8536233116.525801NaNNaNNaN9276.310000NaN2415.879535
\n", - "

2223 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "45 Afghanistan AFG 1995 20881.480 0.833333 Afghani \n", - "46 Afghanistan AFG 1996 21559.923 2.500023 Afghani \n", - "47 Afghanistan AFG 1997 22227.415 3.000030 Afghani \n", - "48 Afghanistan AFG 1998 22912.814 3.000053 Afghani \n", - "49 Afghanistan AFG 1999 23646.128 45.106375 Afghani \n", - "... ... ... ... ... ... ... \n", - "11275 Yemen YEM 2005 20345.000 195.080000 Yemeni Rial \n", - "11276 Yemen YEM 2006 20965.000 198.500000 Yemeni Rial \n", - "11277 Yemen YEM 2007 21591.000 199.540000 Yemeni Rial \n", - "11278 Yemen YEM 2008 22223.000 200.080000 Yemeni Rial \n", - "11279 Yemen YEM 2009 22858.000 207.320000 Yemeni Rial \n", - "\n", - " ppp tcgdp cgdp cgdp2 ... kg \\\n", - "45 0.352981 7640.404208 365.893807 380.608406 ... 11.969276 \n", - "46 1.035618 7541.782643 349.805639 363.579817 ... 12.403287 \n", - "47 1.230919 7420.757993 333.856096 342.188209 ... 2.098612 \n", - "48 1.225851 7203.038357 314.367251 321.797566 ... 2.155247 \n", - "49 18.193448 7053.728453 298.303741 305.275708 ... 2.169332 \n", - "... ... ... ... ... ... ... \n", - "11275 69.501112 49247.125610 2420.600915 2445.644456 ... 6.630541 \n", - "11276 79.718914 51669.180970 2464.544764 2509.971963 ... 7.627067 \n", - "11277 84.656475 55761.428540 2582.623711 2607.372597 ... 8.616352 \n", - "11278 95.889955 59804.720830 2691.118248 2708.301212 ... 7.578654 \n", - "11279 87.617700 61288.814890 2681.285103 2699.266570 ... 8.432549 \n", - "\n", - " ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "45 11.435963 64.779503 575.749694 1427.160971 1432.074990 NaN \n", - "46 11.368530 72.681765 539.935370 1339.773062 1343.634290 NaN \n", - "47 22.681018 57.214244 569.246414 1414.179670 1508.635000 NaN \n", - "48 22.589964 62.186846 539.258652 1340.627874 1430.919956 NaN \n", - "49 22.483448 67.001174 510.554309 1270.043559 1356.481758 NaN \n", - "... ... ... ... ... ... ... \n", - "11275 30.908319 70.762075 3152.987812 9689.452913 9689.452913 NaN \n", - "11276 28.001314 77.513306 3098.297843 9398.235529 9540.051028 NaN \n", - "11277 29.295411 74.538105 3149.613533 9432.763102 9606.653374 NaN \n", - "11278 26.635831 77.739227 3154.238236 9329.826256 9586.031067 NaN \n", - "11279 23.873591 66.853623 3116.525801 NaN NaN NaN \n", - "\n", - " rgdpl2te rgdpl2th rgdptt \n", - "45 NaN NaN 450.097562 \n", - "46 NaN NaN 422.025786 \n", - "47 NaN NaN 388.407429 \n", - "48 NaN NaN 363.011141 \n", - "49 NaN NaN 339.159330 \n", - "... ... ... ... \n", - "11275 9376.655609 NaN 2420.600915 \n", - "11276 9243.472310 NaN 2382.182154 \n", - "11277 9314.041767 NaN 2417.153583 \n", - "11278 9295.538992 NaN 2437.614583 \n", - "11279 9276.310000 NaN 2415.879535 \n", - "\n", - "[2223 rows x 37 columns]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[df.POP>= 20000]" - ] - }, - { - "cell_type": "markdown", - "id": "9b41ebb1", - "metadata": {}, - "source": [ - "例:选择 cc 列和 cg 列的和大于 80 并且 POP 小于 20000 的行。" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "41c190ca", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.640467Z", - "iopub.status.busy": "2023-09-11T14:28:35.639966Z", - "iopub.status.idle": "2023-09-11T14:28:35.699362Z", - "shell.execute_reply": "2023-09-11T14:28:35.697962Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
20AfghanistanAFG197012430.6234.499843e-02Afghani0.0309322544.158761204.668645217.070672...6.8749727.28294211.4007911081.4242212573.7575042628.306751NaNNaNNaN855.028440
21AfghanistanAFG197112749.3854.499843e-02Afghani0.0297172772.708160217.477797233.174215...7.3914398.13690016.5427931107.6788412638.9260072690.518366NaNNaNNaN864.055243
22AfghanistanAFG197213079.4604.499843e-02Afghani0.0283512532.448551193.620268203.815514...7.8949597.22361117.784399945.2989512254.3720642287.650884NaNNaNNaN737.915549
23AfghanistanAFG197313421.3014.499843e-02Afghani0.0268772901.972071216.221369225.405444...7.4510486.50061918.505092999.4004602385.8343042424.683471NaNNaNNaN779.620585
24AfghanistanAFG197413772.0764.499843e-02Afghani0.0283273424.228187248.635586257.753750...7.0986097.78501924.5039371025.2086852449.9576752497.585718NaNNaNNaN812.015225
..................................................................
11395ZimbabweZWE200511639.4702.236364e+01Zimbabwe Dollar39.4828291968.205961169.097559184.183929...6.9957709.37627289.399427214.739197418.970867418.970867NaN390.907086NaN169.097559
11396ZimbabweZWE200611544.3261.643606e+02Zimbabwe Dollar384.8996512132.305773184.705956192.953943...7.64802014.98682381.697014217.543648424.754259407.262097NaN377.352394NaN179.368685
11397ZimbabweZWE200711443.1879.675781e+03Zimbabwe Dollar38583.3239602107.937100184.208918198.215361...8.38710615.78732284.483374202.707080396.486201376.163064NaN345.764991NaN173.113448
11398ZimbabweZWE200811350.0006.715424e+09Zimbabwe Dollar38723.9577401772.209867156.141839162.112294...7.68531213.44444985.117130174.178806343.159758332.649861NaN302.945712NaN142.329054
11399ZimbabweZWE200911383.0001.400000e+17Zimbabwe Dollar40289.9589901906.049843167.447056174.419700...7.90552514.74366783.749534182.613004NaNNaNNaN314.171069NaN151.435285
\n", - "

3827 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "20 Afghanistan AFG 1970 12430.623 4.499843e-02 Afghani \n", - "21 Afghanistan AFG 1971 12749.385 4.499843e-02 Afghani \n", - "22 Afghanistan AFG 1972 13079.460 4.499843e-02 Afghani \n", - "23 Afghanistan AFG 1973 13421.301 4.499843e-02 Afghani \n", - "24 Afghanistan AFG 1974 13772.076 4.499843e-02 Afghani \n", - "... ... ... ... ... ... ... \n", - "11395 Zimbabwe ZWE 2005 11639.470 2.236364e+01 Zimbabwe Dollar \n", - "11396 Zimbabwe ZWE 2006 11544.326 1.643606e+02 Zimbabwe Dollar \n", - "11397 Zimbabwe ZWE 2007 11443.187 9.675781e+03 Zimbabwe Dollar \n", - "11398 Zimbabwe ZWE 2008 11350.000 6.715424e+09 Zimbabwe Dollar \n", - "11399 Zimbabwe ZWE 2009 11383.000 1.400000e+17 Zimbabwe Dollar \n", - "\n", - " ppp tcgdp cgdp cgdp2 ... kg \\\n", - "20 0.030932 2544.158761 204.668645 217.070672 ... 6.874972 \n", - "21 0.029717 2772.708160 217.477797 233.174215 ... 7.391439 \n", - "22 0.028351 2532.448551 193.620268 203.815514 ... 7.894959 \n", - "23 0.026877 2901.972071 216.221369 225.405444 ... 7.451048 \n", - "24 0.028327 3424.228187 248.635586 257.753750 ... 7.098609 \n", - "... ... ... ... ... ... ... \n", - "11395 39.482829 1968.205961 169.097559 184.183929 ... 6.995770 \n", - "11396 384.899651 2132.305773 184.705956 192.953943 ... 7.648020 \n", - "11397 38583.323960 2107.937100 184.208918 198.215361 ... 8.387106 \n", - "11398 38723.957740 1772.209867 156.141839 162.112294 ... 7.685312 \n", - "11399 40289.958990 1906.049843 167.447056 174.419700 ... 7.905525 \n", - "\n", - " ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "20 7.282942 11.400791 1081.424221 2573.757504 2628.306751 NaN \n", - "21 8.136900 16.542793 1107.678841 2638.926007 2690.518366 NaN \n", - "22 7.223611 17.784399 945.298951 2254.372064 2287.650884 NaN \n", - "23 6.500619 18.505092 999.400460 2385.834304 2424.683471 NaN \n", - "24 7.785019 24.503937 1025.208685 2449.957675 2497.585718 NaN \n", - "... ... ... ... ... ... ... \n", - "11395 9.376272 89.399427 214.739197 418.970867 418.970867 NaN \n", - "11396 14.986823 81.697014 217.543648 424.754259 407.262097 NaN \n", - "11397 15.787322 84.483374 202.707080 396.486201 376.163064 NaN \n", - "11398 13.444449 85.117130 174.178806 343.159758 332.649861 NaN \n", - "11399 14.743667 83.749534 182.613004 NaN NaN NaN \n", - "\n", - " rgdpl2te rgdpl2th rgdptt \n", - "20 NaN NaN 855.028440 \n", - "21 NaN NaN 864.055243 \n", - "22 NaN NaN 737.915549 \n", - "23 NaN NaN 779.620585 \n", - "24 NaN NaN 812.015225 \n", - "... ... ... ... \n", - "11395 390.907086 NaN 169.097559 \n", - "11396 377.352394 NaN 179.368685 \n", - "11397 345.764991 NaN 173.113448 \n", - "11398 302.945712 NaN 142.329054 \n", - "11399 314.171069 NaN 151.435285 \n", - "\n", - "[3827 rows x 37 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[(df.cc + df.cg>= 80) & (df.POP <= 20000)]" - ] - }, - { - "cell_type": "markdown", - "id": "e852118c", - "metadata": {}, - "source": [ - "### iloc 或者 loc\n", - "\n", - "使用 `iloc` 函数进行选择,形式应为 `.iloc[rows, columns]`。\n", - "\n", - "可以将 i 理解为 integer,即 i 是整数,表示行或者列位置(位置由被称为 index),`iloc` 即用整数来选择行或者选择列。i 从 0 开始,至 `length-1`。\n", - "\n", - "例如:选择第 2 行到第 5 行(不包括第 5 行),第 0 列到第 4 列(不包括第 4 列)。" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "8735b9bf", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.709224Z", - "iopub.status.busy": "2023-09-11T14:28:35.708558Z", - "iopub.status.idle": "2023-09-11T14:28:35.734853Z", - "shell.execute_reply": "2023-09-11T14:28:35.733785Z" - } - }, - "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", - "
countryisocodeyearPOP
2AfghanistanAFG19528425.333
3AfghanistanAFG19538573.217
4AfghanistanAFG19548728.408
\n", - "
" - ], - "text/plain": [ - " country isocode year POP\n", - "2 Afghanistan AFG 1952 8425.333\n", - "3 Afghanistan AFG 1953 8573.217\n", - "4 Afghanistan AFG 1954 8728.408" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.iloc[2:5, 0:4]" - ] - }, - { - "cell_type": "markdown", - "id": "c084f15e", - "metadata": {}, - "source": [ - "使用 `loc` 函数进行选择,与 `iloc` 的区别在于,`loc` 除了接受整数外,还可以接受标签(`a`、`b` 这样的列名)、表示整数位置的 index、`boolean` 。\n", - "\n", - "例:选择第 2 行到第 5 行(不包括第 5 行),country 和 tcgdp 列。" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "2f27b9fe", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.741522Z", - "iopub.status.busy": "2023-09-11T14:28:35.740660Z", - "iopub.status.idle": "2023-09-11T14:28:35.755208Z", - "shell.execute_reply": "2023-09-11T14:28:35.753903Z" - } - }, - "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", - "
countrytcgdp
2AfghanistanNaN
3AfghanistanNaN
4AfghanistanNaN
\n", - "
" - ], - "text/plain": [ - " country tcgdp\n", - "2 Afghanistan NaN\n", - "3 Afghanistan NaN\n", - "4 Afghanistan NaN" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.loc[df.index[2:5], ['country', 'tcgdp']]" - ] - }, - { - "cell_type": "markdown", - "id": "44f9c427", - "metadata": {}, - "source": [ - "例:使用 `loc` 函数选择 POP 列最大值的行。" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "6ca456d8", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.761251Z", - "iopub.status.busy": "2023-09-11T14:28:35.760778Z", - "iopub.status.idle": "2023-09-11T14:28:35.780924Z", - "shell.execute_reply": "2023-09-11T14:28:35.779352Z" - } - }, - "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", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
2159China Version 1CHN20091323592.06.83Yuan Renminbi3.34244710739325.588113.7734108296.575690...15.77955346.70784258.5794807782.385295NaNNaNNaN11914.32395NaN7314.930606
2219China Version 2CH220091323592.06.83Yuan Renminbi3.16471211342464.268569.4566439227.187296...15.65522439.04420361.2403428247.646160NaNNaNNaN12658.65025NaN7747.331618
\n", - "

2 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit ppp \\\n", - "2159 China Version 1 CHN 2009 1323592.0 6.83 Yuan Renminbi 3.342447 \n", - "2219 China Version 2 CH2 2009 1323592.0 6.83 Yuan Renminbi 3.164712 \n", - "\n", - " tcgdp cgdp cgdp2 ... kg ki \\\n", - "2159 10739325.58 8113.773410 8296.575690 ... 15.779553 46.707842 \n", - "2219 11342464.26 8569.456643 9227.187296 ... 15.655224 39.044203 \n", - "\n", - " openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te \\\n", - "2159 58.579480 7782.385295 NaN NaN NaN 11914.32395 \n", - "2219 61.240342 8247.646160 NaN NaN NaN 12658.65025 \n", - "\n", - " rgdpl2th rgdptt \n", - "2159 NaN 7314.930606 \n", - "2219 NaN 7747.331618 \n", - "\n", - "[2 rows x 37 columns]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.loc[df.POP == max(df.POP)]" - ] - }, - { - "cell_type": "markdown", - "id": "97dd2bd9", - "metadata": {}, - "source": [ - "还可以使用这种形式:`.loc[,]`,两个参数用逗号隔开,第一个参数接受条件,第二个参数接受我们想要返回的列名,得到的是符合条件的特定的列。\n", - "\n", - "例:选择满足 cc 列加 cg 列大于等于80,POP小于等于20000条件的 country, year, POP 三列。" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "b9867333", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.786397Z", - "iopub.status.busy": "2023-09-11T14:28:35.785789Z", - "iopub.status.idle": "2023-09-11T14:28:35.798707Z", - "shell.execute_reply": "2023-09-11T14:28:35.797937Z" - } - }, - "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", - "
countryyearPOP
20Afghanistan197012430.623
21Afghanistan197112749.385
22Afghanistan197213079.460
23Afghanistan197313421.301
24Afghanistan197413772.076
............
11395Zimbabwe200511639.470
11396Zimbabwe200611544.326
11397Zimbabwe200711443.187
11398Zimbabwe200811350.000
11399Zimbabwe200911383.000
\n", - "

3827 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " country year POP\n", - "20 Afghanistan 1970 12430.623\n", - "21 Afghanistan 1971 12749.385\n", - "22 Afghanistan 1972 13079.460\n", - "23 Afghanistan 1973 13421.301\n", - "24 Afghanistan 1974 13772.076\n", - "... ... ... ...\n", - "11395 Zimbabwe 2005 11639.470\n", - "11396 Zimbabwe 2006 11544.326\n", - "11397 Zimbabwe 2007 11443.187\n", - "11398 Zimbabwe 2008 11350.000\n", - "11399 Zimbabwe 2009 11383.000\n", - "\n", - "[3827 rows x 3 columns]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.loc[(df.cc + df.cg>= 80) & (df.POP <= 20000), ['country', 'year', 'POP']]" - ] - }, - { - "cell_type": "markdown", - "id": "e69a9593", - "metadata": {}, - "source": [ - "由于 `iloc` 函数只接受整数,所以不允许使用这种条件进行筛选。\n", - "\n", - "### query\n", - "\n", - "`.query()` 函数的用法与 `[]` 有相似之处。值得注意的是,`.query()` 函数的性能更好,在处理大规模数据时更快。" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "f250cd7f", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.802413Z", - "iopub.status.busy": "2023-09-11T14:28:35.802058Z", - "iopub.status.idle": "2023-09-11T14:28:35.825491Z", - "shell.execute_reply": "2023-09-11T14:28:35.824611Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
45AfghanistanAFG199520881.4800.833333Afghani0.3529817640.404208365.893807380.608406...11.96927611.43596364.779503575.7496941427.1609711432.074990NaNNaNNaN450.097562
46AfghanistanAFG199621559.9232.500023Afghani1.0356187541.782643349.805639363.579817...12.40328711.36853072.681765539.9353701339.7730621343.634290NaNNaNNaN422.025786
47AfghanistanAFG199722227.4153.000030Afghani1.2309197420.757993333.856096342.188209...2.09861222.68101857.214244569.2464141414.1796701508.635000NaNNaNNaN388.407429
48AfghanistanAFG199822912.8143.000053Afghani1.2258517203.038357314.367251321.797566...2.15524722.58996462.186846539.2586521340.6278741430.919956NaNNaNNaN363.011141
49AfghanistanAFG199923646.12845.106375Afghani18.1934487053.728453298.303741305.275708...2.16933222.48344867.001174510.5543091270.0435591356.481758NaNNaNNaN339.159330
..................................................................
11275YemenYEM200520345.000195.080000Yemeni Rial69.50111249247.1256102420.6009152445.644456...6.63054130.90831970.7620753152.9878129689.4529139689.452913NaN9376.655609NaN2420.600915
11276YemenYEM200620965.000198.500000Yemeni Rial79.71891451669.1809702464.5447642509.971963...7.62706728.00131477.5133063098.2978439398.2355299540.051028NaN9243.472310NaN2382.182154
11277YemenYEM200721591.000199.540000Yemeni Rial84.65647555761.4285402582.6237112607.372597...8.61635229.29541174.5381053149.6135339432.7631029606.653374NaN9314.041767NaN2417.153583
11278YemenYEM200822223.000200.080000Yemeni Rial95.88995559804.7208302691.1182482708.301212...7.57865426.63583177.7392273154.2382369329.8262569586.031067NaN9295.538992NaN2437.614583
11279YemenYEM200922858.000207.320000Yemeni Rial87.61770061288.8148902681.2851032699.266570...8.43254923.87359166.8536233116.525801NaNNaNNaN9276.310000NaN2415.879535
\n", - "

2223 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "45 Afghanistan AFG 1995 20881.480 0.833333 Afghani \n", - "46 Afghanistan AFG 1996 21559.923 2.500023 Afghani \n", - "47 Afghanistan AFG 1997 22227.415 3.000030 Afghani \n", - "48 Afghanistan AFG 1998 22912.814 3.000053 Afghani \n", - "49 Afghanistan AFG 1999 23646.128 45.106375 Afghani \n", - "... ... ... ... ... ... ... \n", - "11275 Yemen YEM 2005 20345.000 195.080000 Yemeni Rial \n", - "11276 Yemen YEM 2006 20965.000 198.500000 Yemeni Rial \n", - "11277 Yemen YEM 2007 21591.000 199.540000 Yemeni Rial \n", - "11278 Yemen YEM 2008 22223.000 200.080000 Yemeni Rial \n", - "11279 Yemen YEM 2009 22858.000 207.320000 Yemeni Rial \n", - "\n", - " ppp tcgdp cgdp cgdp2 ... kg \\\n", - "45 0.352981 7640.404208 365.893807 380.608406 ... 11.969276 \n", - "46 1.035618 7541.782643 349.805639 363.579817 ... 12.403287 \n", - "47 1.230919 7420.757993 333.856096 342.188209 ... 2.098612 \n", - "48 1.225851 7203.038357 314.367251 321.797566 ... 2.155247 \n", - "49 18.193448 7053.728453 298.303741 305.275708 ... 2.169332 \n", - "... ... ... ... ... ... ... \n", - "11275 69.501112 49247.125610 2420.600915 2445.644456 ... 6.630541 \n", - "11276 79.718914 51669.180970 2464.544764 2509.971963 ... 7.627067 \n", - "11277 84.656475 55761.428540 2582.623711 2607.372597 ... 8.616352 \n", - "11278 95.889955 59804.720830 2691.118248 2708.301212 ... 7.578654 \n", - "11279 87.617700 61288.814890 2681.285103 2699.266570 ... 8.432549 \n", - "\n", - " ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "45 11.435963 64.779503 575.749694 1427.160971 1432.074990 NaN \n", - "46 11.368530 72.681765 539.935370 1339.773062 1343.634290 NaN \n", - "47 22.681018 57.214244 569.246414 1414.179670 1508.635000 NaN \n", - "48 22.589964 62.186846 539.258652 1340.627874 1430.919956 NaN \n", - "49 22.483448 67.001174 510.554309 1270.043559 1356.481758 NaN \n", - "... ... ... ... ... ... ... \n", - "11275 30.908319 70.762075 3152.987812 9689.452913 9689.452913 NaN \n", - "11276 28.001314 77.513306 3098.297843 9398.235529 9540.051028 NaN \n", - "11277 29.295411 74.538105 3149.613533 9432.763102 9606.653374 NaN \n", - "11278 26.635831 77.739227 3154.238236 9329.826256 9586.031067 NaN \n", - "11279 23.873591 66.853623 3116.525801 NaN NaN NaN \n", - "\n", - " rgdpl2te rgdpl2th rgdptt \n", - "45 NaN NaN 450.097562 \n", - "46 NaN NaN 422.025786 \n", - "47 NaN NaN 388.407429 \n", - "48 NaN NaN 363.011141 \n", - "49 NaN NaN 339.159330 \n", - "... ... ... ... \n", - "11275 9376.655609 NaN 2420.600915 \n", - "11276 9243.472310 NaN 2382.182154 \n", - "11277 9314.041767 NaN 2417.153583 \n", - "11278 9295.538992 NaN 2437.614583 \n", - "11279 9276.310000 NaN 2415.879535 \n", - "\n", - "[2223 rows x 37 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.query(\"POP>= 20000\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "efd95898", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:35.829191Z", - "iopub.status.busy": "2023-09-11T14:28:35.828819Z", - "iopub.status.idle": "2023-09-11T14:28:35.855138Z", - "shell.execute_reply": "2023-09-11T14:28:35.854129Z" - } - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
20AfghanistanAFG197012430.6234.499843e-02Afghani0.0309322544.158761204.668645217.070672...6.8749727.28294211.4007911081.4242212573.7575042628.306751NaNNaNNaN855.028440
21AfghanistanAFG197112749.3854.499843e-02Afghani0.0297172772.708160217.477797233.174215...7.3914398.13690016.5427931107.6788412638.9260072690.518366NaNNaNNaN864.055243
22AfghanistanAFG197213079.4604.499843e-02Afghani0.0283512532.448551193.620268203.815514...7.8949597.22361117.784399945.2989512254.3720642287.650884NaNNaNNaN737.915549
23AfghanistanAFG197313421.3014.499843e-02Afghani0.0268772901.972071216.221369225.405444...7.4510486.50061918.505092999.4004602385.8343042424.683471NaNNaNNaN779.620585
24AfghanistanAFG197413772.0764.499843e-02Afghani0.0283273424.228187248.635586257.753750...7.0986097.78501924.5039371025.2086852449.9576752497.585718NaNNaNNaN812.015225
..................................................................
11395ZimbabweZWE200511639.4702.236364e+01Zimbabwe Dollar39.4828291968.205961169.097559184.183929...6.9957709.37627289.399427214.739197418.970867418.970867NaN390.907086NaN169.097559
11396ZimbabweZWE200611544.3261.643606e+02Zimbabwe Dollar384.8996512132.305773184.705956192.953943...7.64802014.98682381.697014217.543648424.754259407.262097NaN377.352394NaN179.368685
11397ZimbabweZWE200711443.1879.675781e+03Zimbabwe Dollar38583.3239602107.937100184.208918198.215361...8.38710615.78732284.483374202.707080396.486201376.163064NaN345.764991NaN173.113448
11398ZimbabweZWE200811350.0006.715424e+09Zimbabwe Dollar38723.9577401772.209867156.141839162.112294...7.68531213.44444985.117130174.178806343.159758332.649861NaN302.945712NaN142.329054
11399ZimbabweZWE200911383.0001.400000e+17Zimbabwe Dollar40289.9589901906.049843167.447056174.419700...7.90552514.74366783.749534182.613004NaNNaNNaN314.171069NaN151.435285
\n", - "

3827 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "20 Afghanistan AFG 1970 12430.623 4.499843e-02 Afghani \n", - "21 Afghanistan AFG 1971 12749.385 4.499843e-02 Afghani \n", - "22 Afghanistan AFG 1972 13079.460 4.499843e-02 Afghani \n", - "23 Afghanistan AFG 1973 13421.301 4.499843e-02 Afghani \n", - "24 Afghanistan AFG 1974 13772.076 4.499843e-02 Afghani \n", - "... ... ... ... ... ... ... \n", - "11395 Zimbabwe ZWE 2005 11639.470 2.236364e+01 Zimbabwe Dollar \n", - "11396 Zimbabwe ZWE 2006 11544.326 1.643606e+02 Zimbabwe Dollar \n", - "11397 Zimbabwe ZWE 2007 11443.187 9.675781e+03 Zimbabwe Dollar \n", - "11398 Zimbabwe ZWE 2008 11350.000 6.715424e+09 Zimbabwe Dollar \n", - "11399 Zimbabwe ZWE 2009 11383.000 1.400000e+17 Zimbabwe Dollar \n", - "\n", - " ppp tcgdp cgdp cgdp2 ... kg \\\n", - "20 0.030932 2544.158761 204.668645 217.070672 ... 6.874972 \n", - "21 0.029717 2772.708160 217.477797 233.174215 ... 7.391439 \n", - "22 0.028351 2532.448551 193.620268 203.815514 ... 7.894959 \n", - "23 0.026877 2901.972071 216.221369 225.405444 ... 7.451048 \n", - "24 0.028327 3424.228187 248.635586 257.753750 ... 7.098609 \n", - "... ... ... ... ... ... ... \n", - "11395 39.482829 1968.205961 169.097559 184.183929 ... 6.995770 \n", - "11396 384.899651 2132.305773 184.705956 192.953943 ... 7.648020 \n", - "11397 38583.323960 2107.937100 184.208918 198.215361 ... 8.387106 \n", - "11398 38723.957740 1772.209867 156.141839 162.112294 ... 7.685312 \n", - "11399 40289.958990 1906.049843 167.447056 174.419700 ... 7.905525 \n", - "\n", - " ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "20 7.282942 11.400791 1081.424221 2573.757504 2628.306751 NaN \n", - "21 8.136900 16.542793 1107.678841 2638.926007 2690.518366 NaN \n", - "22 7.223611 17.784399 945.298951 2254.372064 2287.650884 NaN \n", - "23 6.500619 18.505092 999.400460 2385.834304 2424.683471 NaN \n", - "24 7.785019 24.503937 1025.208685 2449.957675 2497.585718 NaN \n", - "... ... ... ... ... ... ... \n", - "11395 9.376272 89.399427 214.739197 418.970867 418.970867 NaN \n", - "11396 14.986823 81.697014 217.543648 424.754259 407.262097 NaN \n", - "11397 15.787322 84.483374 202.707080 396.486201 376.163064 NaN \n", - "11398 13.444449 85.117130 174.178806 343.159758 332.649861 NaN \n", - "11399 14.743667 83.749534 182.613004 NaN NaN NaN \n", - "\n", - " rgdpl2te rgdpl2th rgdptt \n", - "20 NaN NaN 855.028440 \n", - "21 NaN NaN 864.055243 \n", - "22 NaN NaN 737.915549 \n", - "23 NaN NaN 779.620585 \n", - "24 NaN NaN 812.015225 \n", - "... ... ... ... \n", - "11395 390.907086 NaN 169.097559 \n", - "11396 377.352394 NaN 179.368685 \n", - "11397 345.764991 NaN 173.113448 \n", - "11398 302.945712 NaN 142.329054 \n", - "11399 314.171069 NaN 151.435285 \n", - "\n", - "[3827 rows x 37 columns]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.query(\"cc + cg>= 80 & POP <= 20000\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/_sources/ch-pandas/index.md b/docs/_sources/ch-pandas/index.md deleted file mode 100644 index 035910dd..00000000 --- a/docs/_sources/ch-pandas/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# pandas - -本节主要讲解如何使用 pandas 进行表格数据处理。 - -```{tableofcontents} -``` \ No newline at end of file diff --git a/docs/_sources/ch-pandas/pandas-intro.md b/docs/_sources/ch-pandas/pandas-intro.md deleted file mode 100644 index 0d9893b4..00000000 --- a/docs/_sources/ch-pandas/pandas-intro.md +++ /dev/null @@ -1,19 +0,0 @@ -# pandas 简介 - -pandas 是一个流行的 Python 数据处理和分析库,它提供了名为 `DataFrame` 的数据结构,`DataFrame` 是一个二维表,有很多行和很多列,类似 Excel 表。基于 `DataFrame` 数据结构,pandas 提供了一系列数据处理和分析函数,是 Python 数据分析必备的库。pandas 的名字据说来自于 *pan*el *da*ta (面板数据),面板数据是计量经济学领域的一个最广泛使用的数据结构。可见,pandas 设计之初主要为经济和金融数据分析服务。 - -## 安装 pandas - -可以使用 `conda` 或者 `pip` 安装: - -```bash -pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple -``` - -## 导入 pandas - -导入 pandas: - -``` -import pandas as pd -``` diff --git a/docs/_sources/ch-pandas/series-dataframe.ipynb b/docs/_sources/ch-pandas/series-dataframe.ipynb deleted file mode 100644 index 7617d345..00000000 --- a/docs/_sources/ch-pandas/series-dataframe.ipynb +++ /dev/null @@ -1,1561 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "87461dd7", - "metadata": {}, - "source": [ - "# Series 与 DataFrame\n", - "\n", - "pandas 的核心数据结构有两个: Series 和 DataFrame。" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "c3935c76", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.169042Z", - "iopub.status.busy": "2023-09-11T14:28:40.168395Z", - "iopub.status.idle": "2023-09-11T14:28:40.636678Z", - "shell.execute_reply": "2023-09-11T14:28:40.635621Z" - } - }, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "markdown", - "id": "d3a4406c", - "metadata": {}, - "source": [ - "## Series\n", - "\n", - "在 pandas 中,`Series` 是一种一维的带标签的 **数组状** 数据结构。\n", - "\n", - "\n", - "\n", - "```{figure} ../img/ch-pandas/Series.svg\n", - "---\n", - "width: 200px\n", - "name: Series-img\n", - "---\n", - "Series\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "我们创建一个 `Series`,这个数组有 4 个数,并命名为 `my_series`。" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "9f760577", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.641587Z", - "iopub.status.busy": "2023-09-11T14:28:40.640964Z", - "iopub.status.idle": "2023-09-11T14:28:40.646056Z", - "shell.execute_reply": "2023-09-11T14:28:40.645276Z" - } - }, - "outputs": [], - "source": [ - "s = pd.Series([1, 2, 3, 4], name = 'my_series')" - ] - }, - { - "cell_type": "markdown", - "id": "acd1d896", - "metadata": {}, - "source": [ - "`Series` 是一个数组状数据结构,其实就是 {numref}`numpy-ndarray` 中的 `ndarray`。 数组最重要的结构是索引(Index)。Index 主要用于标记第几个位置存储什么数据。`pd.Series()` 中不指定 Index 参数时,默认从 0 开始,逐一自增,形如: 0,1,...\n", - "\n", - "- Series 支持计算操作。" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "94626599", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.649994Z", - "iopub.status.busy": "2023-09-11T14:28:40.649658Z", - "iopub.status.idle": "2023-09-11T14:28:40.657337Z", - "shell.execute_reply": "2023-09-11T14:28:40.656733Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0 100\n", - "1 200\n", - "2 300\n", - "3 400\n", - "Name: my_series, dtype: int64" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s * 100" - ] - }, - { - "cell_type": "markdown", - "id": "ee28bbf0", - "metadata": {}, - "source": [ - "- Series 支持描述性统计。比如,获得所有统计信息。" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "3ccd82a9", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.702114Z", - "iopub.status.busy": "2023-09-11T14:28:40.701773Z", - "iopub.status.idle": "2023-09-11T14:28:40.710251Z", - "shell.execute_reply": "2023-09-11T14:28:40.709669Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "count 4.000000\n", - "mean 2.500000\n", - "std 1.290994\n", - "min 1.000000\n", - "25% 1.750000\n", - "50% 2.500000\n", - "75% 3.250000\n", - "max 4.000000\n", - "Name: my_series, dtype: float64" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.describe()" - ] - }, - { - "cell_type": "markdown", - "id": "fb61cc9f", - "metadata": {}, - "source": [ - "计算平均值,中位数和标准差。" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "4e7d31be", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.713632Z", - "iopub.status.busy": "2023-09-11T14:28:40.713273Z", - "iopub.status.idle": "2023-09-11T14:28:40.717942Z", - "shell.execute_reply": "2023-09-11T14:28:40.717294Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2.5" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "2c7599d6", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.721152Z", - "iopub.status.busy": "2023-09-11T14:28:40.720665Z", - "iopub.status.idle": "2023-09-11T14:28:40.725392Z", - "shell.execute_reply": "2023-09-11T14:28:40.724837Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2.5" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.median()" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "0c3aab52", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.728378Z", - "iopub.status.busy": "2023-09-11T14:28:40.728092Z", - "iopub.status.idle": "2023-09-11T14:28:40.733034Z", - "shell.execute_reply": "2023-09-11T14:28:40.732123Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1.2909944487358056" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.std()" - ] - }, - { - "cell_type": "markdown", - "id": "b9aafec8", - "metadata": {}, - "source": [ - "- Series 的索引很灵活。" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "55e7037b", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.736065Z", - "iopub.status.busy": "2023-09-11T14:28:40.735796Z", - "iopub.status.idle": "2023-09-11T14:28:40.739169Z", - "shell.execute_reply": "2023-09-11T14:28:40.738588Z" - } - }, - "outputs": [], - "source": [ - "s.index = ['number1','number2','number3','number4']" - ] - }, - { - "cell_type": "markdown", - "id": "c3c4636d", - "metadata": {}, - "source": [ - "这时,`Series` 就像一个 Python 中的字典 `dict`,可以使用像 `dict` 一样的语法来访问 `Series` 中的元素,其中 `index` 相当于 `dict` 的键 `key`。例如,使用 `[]` 操作符访问 `number1` 对应的值。" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "a9287533", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.742534Z", - "iopub.status.busy": "2023-09-11T14:28:40.742224Z", - "iopub.status.idle": "2023-09-11T14:28:40.746092Z", - "shell.execute_reply": "2023-09-11T14:28:40.745569Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s['number1']" - ] - }, - { - "cell_type": "markdown", - "id": "742ad9b2", - "metadata": {}, - "source": [ - "又例如,使用 `in` 表达式判断某个索引是否在 Series 中。" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "7cd8388f", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.749589Z", - "iopub.status.busy": "2023-09-11T14:28:40.749268Z", - "iopub.status.idle": "2023-09-11T14:28:40.753266Z", - "shell.execute_reply": "2023-09-11T14:28:40.752741Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "'number1' in s" - ] - }, - { - "cell_type": "markdown", - "id": "803dff93", - "metadata": {}, - "source": [ - "## DataFrame\n", - "\n", - "`DataFrame` 可以简单理解为一个 Excel 表,有很多列和很多行,如 {numref}`DataFrame-img` 所示。\n", - "`DataFrame` 的列(column)表示一个字段;`DataFrame` 的行(row)表示一条数据。`DataFrame` 常被用来分析像 Excel 这样的、有行和列的表格类数据。Excel 也正在兼容 `DataFrame`,使得用户在 Excel 中进行 pandas 数据处理与分析。\n", - "\n", - "```{figure} ../img/ch-pandas/DataFrame.svg\n", - "---\n", - "width: 400px\n", - "name: DataFrame-img\n", - "---\n", - "DataFrame 示意图\n", - "```\n", - "\n", - "### 创建 DataFrame\n", - "\n", - "创建一个 `DataFrame` 有很多方式,比如从列表、字典、文件中读取数据,并创建一个 `DataFrame`。\n", - "\n", - "- 基于列表创建" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "29fda5e0", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.756339Z", - "iopub.status.busy": "2023-09-11T14:28:40.756048Z", - "iopub.status.idle": "2023-09-11T14:28:40.760223Z", - "shell.execute_reply": "2023-09-11T14:28:40.759646Z" - } - }, - "outputs": [], - "source": [ - "names = ['Alice', 'Bob', 'Charlie']\n", - "ages = [25, 30, 22]\n", - "cities = ['New York', 'San Francisco', 'Los Angeles']\n", - "data = {'Name': names, 'Age': ages, 'City': cities}\n", - "df = pd.DataFrame(data)" - ] - }, - { - "cell_type": "markdown", - "id": "44c4ceb3", - "metadata": {}, - "source": [ - "- 基于字典创建" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "12cbb41a", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.763170Z", - "iopub.status.busy": "2023-09-11T14:28:40.762893Z", - "iopub.status.idle": "2023-09-11T14:28:40.766599Z", - "shell.execute_reply": "2023-09-11T14:28:40.765960Z" - } - }, - "outputs": [], - "source": [ - "data = {'Column1': [1, 2], 'Column2': [3, 4]}\n", - "df = pd.DataFrame(data)" - ] - }, - { - "cell_type": "markdown", - "id": "3bcbc0ac", - "metadata": {}, - "source": [ - "- 基于文件创建\n", - "\n", - "如 {numref}`file-img` 所示,pandas 可以读取不同类型的文件,进行处理,最后持久化地写入不同类型的文件中。\n", - "\n", - "```{figure} ../img/ch-pandas/file.svg\n", - "---\n", - "width: 600px\n", - "name: file-img\n", - "---\n", - "文件读取/写入\n", - "```\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "对于不同类型的文件,使用不同的函数,比如 `read_csv` 读取 csv 类型的数据。`df = pd.read_csv('/path/file.csv')` 用来读取一个 csv 文件,`df = pd.read_excel('/path/file.xlsx')` 用来读取一个 Excel 文件。\n", - "\n", - "```{note}\n", - "注:csv 文件一般由很多个 column 组成,使用 pd.read_csv 时,默认每个 column 之间的分隔符为逗号(,),pd.read_table 默认分隔符为换行符。这些函数还支持许多其他参数,可以使用 help() 函数查看。\n", - "\n", - "同样地,我们最终也可以将处理过的 DataFrame 写入文件即以文件的格式输出,例:df.to_excel('/path/file.xlsx')则输出为excel文件。\n", - "```\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 计算统计量\n", - "前面我们讲过对 `Series` 对象我们可以计算统计量,而 `DataFrame` 是由一列列 `Series` 对象构成的,自然也可以做相应的计算。\n", - "\n", - "- 对某一列计算相应统计量,本质上还是对 `Series` 对象做统计量计算,如 {numref}`s1-img`。\n", - "\n", - "```{figure} ../img/ch-pandas/s1.svg\n", - "---\n", - "width: 600px\n", - "name: s1-img\n", - "---\n", - "对 Dataframe 一列对象做统计量\n", - "```\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "例:对 `df` 的第一列求平均值。(`DataFrame` 对象的切片操作后续会详细讲解。)" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------- df is -------\n", - " Column1 Column2\n", - "0 1 3\n", - "1 2 4\n", - "------- Column1.mean() -------\n", - "\n", - "Column1 1.5\n", - "dtype: float64\n" - ] - } - ], - "source": [ - "print(\"------- df is -------\\n{}\".format(df))\n", - "print(\"------- Column1.mean() -------\\n\")\n", - "print(df[['Column1']].mean())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 对某几列计算相应统计量。\n", - "\n", - "```{figure} ../img/ch-pandas/s2.svg\n", - "---\n", - "width: 600px\n", - "name: s2-img\n", - "---\n", - "对 Dataframe 几列对象做统计量\n", - "```\n", - "\n", - "例:对 `df` 的第一列和第二列进行描述性统计。\n", - "\n", - "> 由于这里的 `df` 只有两列,也可以直接对整个 `DataFrame` 对象操作,即等价于 `df.describe()`\n" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "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", - "
Column1Column2
count2.0000002.000000
mean1.5000003.500000
std0.7071070.707107
min1.0000003.000000
25%1.2500003.250000
50%1.5000003.500000
75%1.7500003.750000
max2.0000004.000000
\n", - "
" - ], - "text/plain": [ - " Column1 Column2\n", - "count 2.000000 2.000000\n", - "mean 1.500000 3.500000\n", - "std 0.707107 0.707107\n", - "min 1.000000 3.000000\n", - "25% 1.250000 3.250000\n", - "50% 1.500000 3.500000\n", - "75% 1.750000 3.750000\n", - "max 2.000000 4.000000" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[['Column1','Column2']].describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- 使用 `DataFrame.agg()` 方法计算特定的统计量组合。\n", - "\n", - "有时候我们对一列需要指定的一些统计量,对不同列又有不同的需求,则可以使用 `DataFrame.agg()` 方法,传入字典参数,`key` 为列名,`value` 为需要的统计量的列表。\n", - "\n", - "例:对 `df` 的第一列获得最小值 / 最大值 / 中位数 / 偏度,对第二列获得最小值 / 最大值 / 中位数 / 均值。" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "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", - "
Column1Column2
min1.03.0
max2.04.0
median1.53.5
skewNaNNaN
meanNaN3.5
\n", - "
" - ], - "text/plain": [ - " Column1 Column2\n", - "min 1.0 3.0\n", - "max 2.0 4.0\n", - "median 1.5 3.5\n", - "skew NaN NaN\n", - "mean NaN 3.5" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.agg({\n", - " 'Column1':['min','max','median','skew'],\n", - " 'Column2':['min','max','median','mean'] \n", - "})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 案例:PWT\n", - "\n", - "[PWT](https://www.rug.nl/ggdc/productivity/pwt/) 是一个经济学数据库,用于比较国家和地区之间的宏观经济数据,该数据集包含了各种宏观经济指标,如国内生产总值(GDP)、人均收入、劳动力和资本等因素,以及价格水平、汇率等信息。我们先下载,并使用 pandas 简单探索该数据集。" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "ec624d37", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.769975Z", - "iopub.status.busy": "2023-09-11T14:28:40.769708Z", - "iopub.status.idle": "2023-09-11T14:28:40.775507Z", - "shell.execute_reply": "2023-09-11T14:28:40.774814Z" - }, - "tags": [ - "hide-cell" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "文件夹已存在,无需操作。\n" - ] - } - ], - "source": [ - "import os\n", - "import urllib.request\n", - "import zipfile\n", - "\n", - "folder_path = os.path.join(os.getcwd(), \"../data/pwt\")\n", - "download_url = \"https://www.rug.nl/ggdc/docs/pwt70_06032011version.zip\"\n", - "file_name = download_url.split(\"/\")[-1]\n", - "if not os.path.exists(folder_path):\n", - " # 创建文件夹\n", - " os.makedirs(folder_path)\n", - " print(f\"文件夹不存在,已创建。\")\n", - "\n", - " zip_file_path = os.path.join(folder_path, file_name)\n", - "\n", - " urllib.request.urlretrieve(download_url, zip_file_path)\n", - " with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:\n", - " zip_ref.extractall(folder_path)\n", - " print(\"数据已下载并解压缩。\")\n", - "else:\n", - " print(f\"文件夹已存在,无需操作。\")" - ] - }, - { - "cell_type": "markdown", - "id": "95000970", - "metadata": {}, - "source": [ - "### 查看数据\n", - "\n", - "- 使用 `read_csv()` 读取数据。" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "c052691d", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.778644Z", - "iopub.status.busy": "2023-09-11T14:28:40.778391Z", - "iopub.status.idle": "2023-09-11T14:28:40.843164Z", - "shell.execute_reply": "2023-09-11T14:28:40.842425Z" - } - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "df = pd.read_csv(os.path.join(folder_path, \"pwt70_w_country_names.csv\"))" - ] - }, - { - "cell_type": "markdown", - "id": "02bb3eac", - "metadata": {}, - "source": [ - "- `head()` 函数可以指定查看前 n 行。" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "23a5ed20", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.847188Z", - "iopub.status.busy": "2023-09-11T14:28:40.846889Z", - "iopub.status.idle": "2023-09-11T14:28:40.864154Z", - "shell.execute_reply": "2023-09-11T14:28:40.863498Z" - } - }, - "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", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
0AfghanistanAFG19508150.368NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1AfghanistanAFG19518284.473NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2AfghanistanAFG19528425.333NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3AfghanistanAFG19538573.217NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4AfghanistanAFG19548728.408NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "

5 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit ppp tcgdp cgdp \\\n", - "0 Afghanistan AFG 1950 8150.368 NaN NaN NaN NaN NaN \n", - "1 Afghanistan AFG 1951 8284.473 NaN NaN NaN NaN NaN \n", - "2 Afghanistan AFG 1952 8425.333 NaN NaN NaN NaN NaN \n", - "3 Afghanistan AFG 1953 8573.217 NaN NaN NaN NaN NaN \n", - "4 Afghanistan AFG 1954 8728.408 NaN NaN NaN NaN NaN \n", - "\n", - " cgdp2 ... kg ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te \\\n", - "0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN \n", - "1 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN \n", - "2 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN \n", - "3 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN \n", - "4 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN \n", - "\n", - " rgdpl2th rgdptt \n", - "0 NaN NaN \n", - "1 NaN NaN \n", - "2 NaN NaN \n", - "3 NaN NaN \n", - "4 NaN NaN \n", - "\n", - "[5 rows x 37 columns]" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "n = 5\n", - "df.head(n)" - ] - }, - { - "cell_type": "markdown", - "id": "e23f066a", - "metadata": {}, - "source": [ - "- `tail()` 函数指定查看后 n 行。" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "f84177de", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.867546Z", - "iopub.status.busy": "2023-09-11T14:28:40.867222Z", - "iopub.status.idle": "2023-09-11T14:28:40.882612Z", - "shell.execute_reply": "2023-09-11T14:28:40.881929Z" - } - }, - "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", - "
countryisocodeyearPOPXRATCurrency_Unitppptcgdpcgdpcgdp2...kgkiopenkrgdpeqargdpwokrgdpl2wokrgdpl2pergdpl2tergdpl2thrgdptt
11395ZimbabweZWE200511639.4702.236364e+01Zimbabwe Dollar39.4828291968.205961169.097559184.183929...6.9957709.37627289.399427214.739197418.970867418.970867NaN390.907086NaN169.097559
11396ZimbabweZWE200611544.3261.643606e+02Zimbabwe Dollar384.8996512132.305773184.705956192.953943...7.64802014.98682381.697014217.543648424.754259407.262097NaN377.352394NaN179.368685
11397ZimbabweZWE200711443.1879.675781e+03Zimbabwe Dollar38583.3239602107.937100184.208918198.215361...8.38710615.78732284.483374202.707080396.486201376.163064NaN345.764991NaN173.113448
11398ZimbabweZWE200811350.0006.715424e+09Zimbabwe Dollar38723.9577401772.209867156.141839162.112294...7.68531213.44444985.117130174.178806343.159758332.649861NaN302.945712NaN142.329054
11399ZimbabweZWE200911383.0001.400000e+17Zimbabwe Dollar40289.9589901906.049843167.447056174.419700...7.90552514.74366783.749534182.613004NaNNaNNaN314.171069NaN151.435285
\n", - "

5 rows × 37 columns

\n", - "
" - ], - "text/plain": [ - " country isocode year POP XRAT Currency_Unit \\\n", - "11395 Zimbabwe ZWE 2005 11639.470 2.236364e+01 Zimbabwe Dollar \n", - "11396 Zimbabwe ZWE 2006 11544.326 1.643606e+02 Zimbabwe Dollar \n", - "11397 Zimbabwe ZWE 2007 11443.187 9.675781e+03 Zimbabwe Dollar \n", - "11398 Zimbabwe ZWE 2008 11350.000 6.715424e+09 Zimbabwe Dollar \n", - "11399 Zimbabwe ZWE 2009 11383.000 1.400000e+17 Zimbabwe Dollar \n", - "\n", - " ppp tcgdp cgdp cgdp2 ... kg \\\n", - "11395 39.482829 1968.205961 169.097559 184.183929 ... 6.995770 \n", - "11396 384.899651 2132.305773 184.705956 192.953943 ... 7.648020 \n", - "11397 38583.323960 2107.937100 184.208918 198.215361 ... 8.387106 \n", - "11398 38723.957740 1772.209867 156.141839 162.112294 ... 7.685312 \n", - "11399 40289.958990 1906.049843 167.447056 174.419700 ... 7.905525 \n", - "\n", - " ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe \\\n", - "11395 9.376272 89.399427 214.739197 418.970867 418.970867 NaN \n", - "11396 14.986823 81.697014 217.543648 424.754259 407.262097 NaN \n", - "11397 15.787322 84.483374 202.707080 396.486201 376.163064 NaN \n", - "11398 13.444449 85.117130 174.178806 343.159758 332.649861 NaN \n", - "11399 14.743667 83.749534 182.613004 NaN NaN NaN \n", - "\n", - " rgdpl2te rgdpl2th rgdptt \n", - "11395 390.907086 NaN 169.097559 \n", - "11396 377.352394 NaN 179.368685 \n", - "11397 345.764991 NaN 173.113448 \n", - "11398 302.945712 NaN 142.329054 \n", - "11399 314.171069 NaN 151.435285 \n", - "\n", - "[5 rows x 37 columns]" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.tail(n)" - ] - }, - { - "cell_type": "markdown", - "id": "7fc4d38e", - "metadata": {}, - "source": [ - "- `info()` 函数可以查看数据基本信息,包括字段类型和非空值计数。" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "5f0544f4", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.885898Z", - "iopub.status.busy": "2023-09-11T14:28:40.885620Z", - "iopub.status.idle": "2023-09-11T14:28:40.902725Z", - "shell.execute_reply": "2023-09-11T14:28:40.901977Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 11400 entries, 0 to 11399\n", - "Data columns (total 37 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 country 11400 non-null object \n", - " 1 isocode 11400 non-null object \n", - " 2 year 11400 non-null int64 \n", - " 3 POP 11398 non-null float64\n", - " 4 XRAT 10163 non-null float64\n", - " 5 Currency_Unit 10163 non-null object \n", - " 6 ppp 8745 non-null float64\n", - " 7 tcgdp 8745 non-null float64\n", - " 8 cgdp 8745 non-null float64\n", - " 9 cgdp2 8745 non-null float64\n", - " 10 cda2 8745 non-null float64\n", - " 11 cc 8745 non-null float64\n", - " 12 cg 8745 non-null float64\n", - " 13 ci 8745 non-null float64\n", - " 14 p 8745 non-null float64\n", - " 15 p2 8745 non-null float64\n", - " 16 pc 8745 non-null float64\n", - " 17 pg 8745 non-null float64\n", - " 18 pi 8745 non-null float64\n", - " 19 openc 8745 non-null float64\n", - " 20 cgnp 8305 non-null float64\n", - " 21 y 8745 non-null float64\n", - " 22 y2 8745 non-null float64\n", - " 23 rgdpl 8725 non-null float64\n", - " 24 rgdpl2 8725 non-null float64\n", - " 25 rgdpch 8725 non-null float64\n", - " 26 kc 8725 non-null float64\n", - " 27 kg 8725 non-null float64\n", - " 28 ki 8725 non-null float64\n", - " 29 openk 8725 non-null float64\n", - " 30 rgdpeqa 8555 non-null float64\n", - " 31 rgdpwok 8177 non-null float64\n", - " 32 rgdpl2wok 8177 non-null float64\n", - " 33 rgdpl2pe 845 non-null float64\n", - " 34 rgdpl2te 5399 non-null float64\n", - " 35 rgdpl2th 2274 non-null float64\n", - " 36 rgdptt 8745 non-null float64\n", - "dtypes: float64(33), int64(1), object(3)\n", - "memory usage: 3.2+ MB\n" - ] - } - ], - "source": [ - "df.info()" - ] - }, - { - "cell_type": "markdown", - "id": "6da6d798", - "metadata": {}, - "source": [ - "- `dtypes` 查看各变量数据类型。" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "821c9174", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.906608Z", - "iopub.status.busy": "2023-09-11T14:28:40.906159Z", - "iopub.status.idle": "2023-09-11T14:28:40.912041Z", - "shell.execute_reply": "2023-09-11T14:28:40.911460Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "country object\n", - "isocode object\n", - "year int64\n", - "POP float64\n", - "XRAT float64\n", - "Currency_Unit object\n", - "ppp float64\n", - "tcgdp float64\n", - "cgdp float64\n", - "cgdp2 float64\n", - "cda2 float64\n", - "cc float64\n", - "cg float64\n", - "ci float64\n", - "p float64\n", - "p2 float64\n", - "pc float64\n", - "pg float64\n", - "pi float64\n", - "openc float64\n", - "cgnp float64\n", - "y float64\n", - "y2 float64\n", - "rgdpl float64\n", - "rgdpl2 float64\n", - "rgdpch float64\n", - "kc float64\n", - "kg float64\n", - "ki float64\n", - "openk float64\n", - "rgdpeqa float64\n", - "rgdpwok float64\n", - "rgdpl2wok float64\n", - "rgdpl2pe float64\n", - "rgdpl2te float64\n", - "rgdpl2th float64\n", - "rgdptt float64\n", - "dtype: object" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.dtypes" - ] - }, - { - "cell_type": "markdown", - "id": "c785385d", - "metadata": {}, - "source": [ - "- `.columns` 查看数据框列名(变量名)。" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "aae06a0c", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.915371Z", - "iopub.status.busy": "2023-09-11T14:28:40.915069Z", - "iopub.status.idle": "2023-09-11T14:28:40.920483Z", - "shell.execute_reply": "2023-09-11T14:28:40.919762Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['country', 'isocode', 'year', 'POP', 'XRAT', 'Currency_Unit', 'ppp',\n", - " 'tcgdp', 'cgdp', 'cgdp2', 'cda2', 'cc', 'cg', 'ci', 'p', 'p2', 'pc',\n", - " 'pg', 'pi', 'openc', 'cgnp', 'y', 'y2', 'rgdpl', 'rgdpl2', 'rgdpch',\n", - " 'kc', 'kg', 'ki', 'openk', 'rgdpeqa', 'rgdpwok', 'rgdpl2wok',\n", - " 'rgdpl2pe', 'rgdpl2te', 'rgdpl2th', 'rgdptt'],\n", - " dtype='object')" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.columns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- `rename()` 函数既可以用于更改行标签,也可以用于列标签。传入一个字典,其中键为当前名称,值为新名称,以更新相应的名称。\n", - "\n", - "例:\n", - "1. 将 year 改为 Year,country 改为 Country:\n", - "\n", - "```\n", - "df_renamed = df.rename(columns={'year':Year, 'country':'Country'})\n", - "```\n", - "\n", - "2. 将所有列名改为小写:\n", - "\n", - "```\n", - "df_renamed = df.rename(columns=str.lower)\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "caa074bf", - "metadata": {}, - "source": [ - "- `.index` 查看数据框行名。" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "9e1b3c2f", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.923853Z", - "iopub.status.busy": "2023-09-11T14:28:40.923560Z", - "iopub.status.idle": "2023-09-11T14:28:40.928749Z", - "shell.execute_reply": "2023-09-11T14:28:40.928022Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "RangeIndex(start=0, stop=11400, step=1)" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.index" - ] - }, - { - "cell_type": "markdown", - "id": "67b007e6", - "metadata": {}, - "source": [ - "- `.shape` 可以查看 `DataFrame` 的维度,返回一个 tuple(元组对象),显示数据框的行数和列数。因此,可以用索引分别查看数据框的行数和列数。" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "ccc0d0c6", - "metadata": { - "execution": { - "iopub.execute_input": "2023-09-11T14:28:40.932633Z", - "iopub.status.busy": "2023-09-11T14:28:40.932224Z", - "iopub.status.idle": "2023-09-11T14:28:40.937219Z", - "shell.execute_reply": "2023-09-11T14:28:40.936043Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "11400\n", - "37\n" - ] - } - ], - "source": [ - "#查看数据框行数\n", - "print(df.shape[0])\n", - "\n", - "#查看数据框列数\n", - "print(df.shape[1])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyds", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/_sources/index.md b/docs/_sources/index.md deleted file mode 100644 index b56bd4f7..00000000 --- a/docs/_sources/index.md +++ /dev/null @@ -1,98 +0,0 @@ -# Python 数据科学实战 - -::::{grid} 2 -:reverse: - -:::{grid-item} -:columns: 4 -:class: sd-m-auto - - -::: - -:::{grid-item} -:columns: 8 -:class: sd-fs-3 -开源的、面向人文社科的、案例驱动的 Python 数据科学书籍。 - -% The SVG rendering breaks latex builds for the GitHub badge, so only include in HTML -```{only} html -[![](https://img.shields.io/github/stars/godaai/python-data-science?style=for-the-badge)](https://github.com/godaai/python-data-science) -``` - -::: - -:::: - -::::{card-carousel} 3 - -:::{card} -:margin: 3 -:class-body: text-center -:class-header: bg-light text-center -**数据处理与计算 ✏️** -^^^ - -使用NumPy 和 pandas 进行数学计算、数据预处理。使用 matplotlib 和 plotly 进行数据可视化。 -::: - -:::{card} -:margin: 3 -:class-body: text-center -:class-header: bg-light text-center -**机器学习 🚀** -^^^ - -使用 PyTorch、scikit-learn 和 statsmodels 进行机器学习。 -::: - -:::: - -## 主要作者 - -::::{grid} -:class-container: text-center -:gutter: 3 - -:::{grid-item-card} -:link-type: doc -:class-header: bg-light - -鲁蔚征 -^^^ - -中国人民大学助理研究员,CCF高性能计算专业委员会执行委员,主要研究大数据与机器学习系统,《Flink原理与实践》作者。 -::: - -:::: - -## 赞赏与支持 - -如果您觉得本书有价值,您可通过支付宝或微信赞赏。 - -::::{card-carousel} 2 - -:::{card} -:margin: 3 -:class-body: text-center -:class-header: bg-light text-center -**支付宝** -^^^ -```{image} ./img/donate/alipay.png -:height: 100 -``` -::: - -:::{card} -:margin: 3 -:class-body: text-center -:class-header: bg-light text-center - -**微信** -^^^ -```{image} ./img/donate/wechat.png -:height: 100 -``` -::: - -:::: diff --git a/docs/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css b/docs/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css deleted file mode 100644 index 3225661c..00000000 --- a/docs/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css +++ /dev/null @@ -1 +0,0 @@ -.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/docs/_sphinx_design_static/design-tabs.js b/docs/_sphinx_design_static/design-tabs.js deleted file mode 100644 index 36b38cf0..00000000 --- a/docs/_sphinx_design_static/design-tabs.js +++ /dev/null @@ -1,27 +0,0 @@ -var sd_labels_by_text = {}; - -function ready() { - const li = document.getElementsByClassName("sd-tab-label"); - for (const label of li) { - syncId = label.getAttribute("data-sync-id"); - if (syncId) { - label.onclick = onLabelClick; - if (!sd_labels_by_text[syncId]) { - sd_labels_by_text[syncId] = []; - } - sd_labels_by_text[syncId].push(label); - } - } -} - -function onLabelClick() { - // Activate other inputs with the same sync id. - syncId = this.getAttribute("data-sync-id"); - for (label of sd_labels_by_text[syncId]) { - if (label === this) continue; - label.previousElementSibling.checked = true; - } - window.localStorage.setItem("sphinx-design-last-tab", syncId); -} - -document.addEventListener("DOMContentLoaded", ready, false); diff --git a/docs/_static/_sphinx_javascript_frameworks_compat.js b/docs/_static/_sphinx_javascript_frameworks_compat.js deleted file mode 100644 index 8549469d..00000000 --- a/docs/_static/_sphinx_javascript_frameworks_compat.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - * _sphinx_javascript_frameworks_compat.js - * ~~~~~~~~~~ - * - * Compatability shim for jQuery and underscores.js. - * - * WILL BE REMOVED IN Sphinx 6.0 - * xref RemovedInSphinx60Warning - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} diff --git a/docs/_static/basic.css b/docs/_static/basic.css deleted file mode 100644 index 9e364ed3..00000000 --- a/docs/_static/basic.css +++ /dev/null @@ -1,930 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 270px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} -nav.contents, -aside.topic, - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ -nav.contents, -aside.topic, - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, - -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, - -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -/* Docutils 0.17 and older (footnotes & citations) */ -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -/* Docutils 0.18+ (footnotes & citations) */ -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -/* Footnotes & citations ends */ - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/_static/check-solid.svg b/docs/_static/check-solid.svg deleted file mode 100644 index 92fad4b5..00000000 --- a/docs/_static/check-solid.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/_static/clipboard.min.js b/docs/_static/clipboard.min.js deleted file mode 100644 index 54b3c463..00000000 --- a/docs/_static/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.8 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 - - - - diff --git a/docs/_static/copybutton.css b/docs/_static/copybutton.css deleted file mode 100644 index f1916ec7..00000000 --- a/docs/_static/copybutton.css +++ /dev/null @@ -1,94 +0,0 @@ -/* Copy buttons */ -button.copybtn { - position: absolute; - display: flex; - top: .3em; - right: .3em; - width: 1.7em; - height: 1.7em; - opacity: 0; - transition: opacity 0.3s, border .3s, background-color .3s; - user-select: none; - padding: 0; - border: none; - outline: none; - border-radius: 0.4em; - /* The colors that GitHub uses */ - border: #1b1f2426 1px solid; - background-color: #f6f8fa; - color: #57606a; -} - -button.copybtn.success { - border-color: #22863a; - color: #22863a; -} - -button.copybtn svg { - stroke: currentColor; - width: 1.5em; - height: 1.5em; - padding: 0.1em; -} - -div.highlight { - position: relative; -} - -/* Show the copybutton */ -.highlight:hover button.copybtn, button.copybtn.success { - opacity: 1; -} - -.highlight button.copybtn:hover { - background-color: rgb(235, 235, 235); -} - -.highlight button.copybtn:active { - background-color: rgb(187, 187, 187); -} - -/** - * A minimal CSS-only tooltip copied from: - * https://codepen.io/mildrenben/pen/rVBrpK - * - * To use, write HTML like the following: - * - *

Short

- */ - .o-tooltip--left { - position: relative; - } - - .o-tooltip--left:after { - opacity: 0; - visibility: hidden; - position: absolute; - content: attr(data-tooltip); - padding: .2em; - font-size: .8em; - left: -.2em; - background: grey; - color: white; - white-space: nowrap; - z-index: 2; - border-radius: 2px; - transform: translateX(-102%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); -} - -.o-tooltip--left:hover:after { - display: block; - opacity: 1; - visibility: visible; - transform: translateX(-100%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); - transition-delay: .5s; -} - -/* By default the copy button shouldn't show up when printing a page */ -@media print { - button.copybtn { - display: none; - } -} diff --git a/docs/_static/copybutton.js b/docs/_static/copybutton.js deleted file mode 100644 index 2ea7ff3e..00000000 --- a/docs/_static/copybutton.js +++ /dev/null @@ -1,248 +0,0 @@ -// Localization support -const messages = { - 'en': { - 'copy': 'Copy', - 'copy_to_clipboard': 'Copy to clipboard', - 'copy_success': 'Copied!', - 'copy_failure': 'Failed to copy', - }, - 'es' : { - 'copy': 'Copiar', - 'copy_to_clipboard': 'Copiar al portapapeles', - 'copy_success': '¡Copiado!', - 'copy_failure': 'Error al copiar', - }, - 'de' : { - 'copy': 'Kopieren', - 'copy_to_clipboard': 'In die Zwischenablage kopieren', - 'copy_success': 'Kopiert!', - 'copy_failure': 'Fehler beim Kopieren', - }, - 'fr' : { - 'copy': 'Copier', - 'copy_to_clipboard': 'Copier dans le presse-papier', - 'copy_success': 'Copié !', - 'copy_failure': 'Échec de la copie', - }, - 'ru': { - 'copy': 'Скопировать', - 'copy_to_clipboard': 'Скопировать в буфер', - 'copy_success': 'Скопировано!', - 'copy_failure': 'Не удалось скопировать', - }, - 'zh-CN': { - 'copy': '复制', - 'copy_to_clipboard': '复制到剪贴板', - 'copy_success': '复制成功!', - 'copy_failure': '复制失败', - }, - 'it' : { - 'copy': 'Copiare', - 'copy_to_clipboard': 'Copiato negli appunti', - 'copy_success': 'Copiato!', - 'copy_failure': 'Errore durante la copia', - } -} - -let locale = 'en' -if( document.documentElement.lang !== undefined - && messages[document.documentElement.lang] !== undefined ) { - locale = document.documentElement.lang -} - -let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; -if (doc_url_root == '#') { - doc_url_root = ''; -} - -/** - * SVG files for our copy buttons - */ -let iconCheck = ` - ${messages[locale]['copy_success']} - - -` - -// If the user specified their own SVG use that, otherwise use the default -let iconCopy = ``; -if (!iconCopy) { - iconCopy = ` - ${messages[locale]['copy_to_clipboard']} - - - -` -} - -/** - * Set up copy/paste for code blocks - */ - -const runWhenDOMLoaded = cb => { - if (document.readyState != 'loading') { - cb() - } else if (document.addEventListener) { - document.addEventListener('DOMContentLoaded', cb) - } else { - document.attachEvent('onreadystatechange', function() { - if (document.readyState == 'complete') cb() - }) - } -} - -const codeCellId = index => `codecell${index}` - -// Clears selected text since ClipboardJS will select the text when copying -const clearSelection = () => { - if (window.getSelection) { - window.getSelection().removeAllRanges() - } else if (document.selection) { - document.selection.empty() - } -} - -// Changes tooltip text for a moment, then changes it back -// We want the timeout of our `success` class to be a bit shorter than the -// tooltip and icon change, so that we can hide the icon before changing back. -var timeoutIcon = 2000; -var timeoutSuccessClass = 1500; - -const temporarilyChangeTooltip = (el, oldText, newText) => { - el.setAttribute('data-tooltip', newText) - el.classList.add('success') - // Remove success a little bit sooner than we change the tooltip - // So that we can use CSS to hide the copybutton first - setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) - setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) -} - -// Changes the copy button icon for two seconds, then changes it back -const temporarilyChangeIcon = (el) => { - el.innerHTML = iconCheck; - setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) -} - -const addCopyButtonToCodeCells = () => { - // If ClipboardJS hasn't loaded, wait a bit and try again. This - // happens because we load ClipboardJS asynchronously. - if (window.ClipboardJS === undefined) { - setTimeout(addCopyButtonToCodeCells, 250) - return - } - - // Add copybuttons to all of our code cells - const COPYBUTTON_SELECTOR = 'div.highlight pre'; - const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) - codeCells.forEach((codeCell, index) => { - const id = codeCellId(index) - codeCell.setAttribute('id', id) - - const clipboardButton = id => - `` - codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) - }) - -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -/** - * Removes excluded text from a Node. - * - * @param {Node} target Node to filter. - * @param {string} exclude CSS selector of nodes to exclude. - * @returns {DOMString} Text from `target` with text removed. - */ -function filterText(target, exclude) { - const clone = target.cloneNode(true); // clone as to not modify the live DOM - if (exclude) { - // remove excluded nodes - clone.querySelectorAll(exclude).forEach(node => node.remove()); - } - return clone.innerText; -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} - - -var copyTargetText = (trigger) => { - var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); - - // get filtered text - let exclude = '.linenos'; - - let text = filterText(target, exclude); - return formatCopyText(text, '', false, true, true, true, '', '') -} - - // Initialize with a callback so we can modify the text before copy - const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) - - // Update UI with error/success messages - clipboard.on('success', event => { - clearSelection() - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) - temporarilyChangeIcon(event.trigger) - }) - - clipboard.on('error', event => { - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) - }) -} - -runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/docs/_static/copybutton_funcs.js b/docs/_static/copybutton_funcs.js deleted file mode 100644 index dbe1aaad..00000000 --- a/docs/_static/copybutton_funcs.js +++ /dev/null @@ -1,73 +0,0 @@ -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -/** - * Removes excluded text from a Node. - * - * @param {Node} target Node to filter. - * @param {string} exclude CSS selector of nodes to exclude. - * @returns {DOMString} Text from `target` with text removed. - */ -export function filterText(target, exclude) { - const clone = target.cloneNode(true); // clone as to not modify the live DOM - if (exclude) { - // remove excluded nodes - clone.querySelectorAll(exclude).forEach(node => node.remove()); - } - return clone.innerText; -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} diff --git a/docs/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css b/docs/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css deleted file mode 100644 index 3225661c..00000000 --- a/docs/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css +++ /dev/null @@ -1 +0,0 @@ -.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/docs/_static/design-tabs.js b/docs/_static/design-tabs.js deleted file mode 100644 index 36b38cf0..00000000 --- a/docs/_static/design-tabs.js +++ /dev/null @@ -1,27 +0,0 @@ -var sd_labels_by_text = {}; - -function ready() { - const li = document.getElementsByClassName("sd-tab-label"); - for (const label of li) { - syncId = label.getAttribute("data-sync-id"); - if (syncId) { - label.onclick = onLabelClick; - if (!sd_labels_by_text[syncId]) { - sd_labels_by_text[syncId] = []; - } - sd_labels_by_text[syncId].push(label); - } - } -} - -function onLabelClick() { - // Activate other inputs with the same sync id. - syncId = this.getAttribute("data-sync-id"); - for (label of sd_labels_by_text[syncId]) { - if (label === this) continue; - label.previousElementSibling.checked = true; - } - window.localStorage.setItem("sphinx-design-last-tab", syncId); -} - -document.addEventListener("DOMContentLoaded", ready, false); diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js deleted file mode 100644 index c3db08d1..00000000 --- a/docs/_static/doctools.js +++ /dev/null @@ -1,264 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.highlightSearchWords(); - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords: () => { - const highlight = - new URLSearchParams(window.location.search).get("highlight") || ""; - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - const url = new URL(window.location); - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - const blacklistedElements = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", - ]); - document.addEventListener("keydown", (event) => { - if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements - if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - case "Escape": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.hideSearchWords(); - event.preventDefault(); - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js deleted file mode 100644 index 162a6ba8..00000000 --- a/docs/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: false, -}; \ No newline at end of file diff --git a/docs/_static/file.png b/docs/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/docs/_static/images/logo_binder.svg b/docs/_static/images/logo_binder.svg deleted file mode 100644 index 45fecf75..00000000 --- a/docs/_static/images/logo_binder.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - -logo - - - - - - - - diff --git a/docs/_static/images/logo_colab.png b/docs/_static/images/logo_colab.png deleted file mode 100644 index b7560ec216b2d1b6f77855525fe966c741833428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7601 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 diff --git a/docs/_static/images/logo_jupyterhub.svg b/docs/_static/images/logo_jupyterhub.svg deleted file mode 100644 index 60cfe9f2..00000000 --- a/docs/_static/images/logo_jupyterhub.svg +++ /dev/null @@ -1 +0,0 @@ -logo_jupyterhubHub diff --git a/docs/_static/jquery-3.6.0.js b/docs/_static/jquery-3.6.0.js deleted file mode 100644 index fc6c299b..00000000 --- a/docs/_static/jquery-3.6.0.js +++ /dev/null @@ -1,10881 +0,0 @@ -/*! - * jQuery JavaScript Library v3.6.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2021-03-02T17:08Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 - // Plus for old WebKit, typeof returns "function" for HTML collections - // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) - return typeof obj === "function" && typeof obj.nodeType !== "number" && - typeof obj.item !== "function"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.6.0", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), - function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); - } ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.6 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2021-02-16 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -} -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the primary Deferred - primary = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ).filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ).map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - -originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " -{% endmacro %} diff --git a/docs/_static/scripts/bootstrap.js b/docs/_static/scripts/bootstrap.js deleted file mode 100644 index bda8a602..00000000 --- a/docs/_static/scripts/bootstrap.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see bootstrap.js.LICENSE.txt */ -(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>w,afterRead:()=>b,afterWrite:()=>T,applyStyles:()=>D,arrow:()=>G,auto:()=>r,basePlacements:()=>a,beforeMain:()=>v,beforeRead:()=>g,beforeWrite:()=>E,bottom:()=>n,clippingParents:()=>h,computeStyles:()=>et,createPopper:()=>St,createPopperBase:()=>Lt,createPopperLite:()=>Dt,detectOverflow:()=>gt,end:()=>c,eventListeners:()=>nt,flip:()=>_t,hide:()=>yt,left:()=>o,main:()=>y,modifierPhases:()=>C,offset:()=>wt,placements:()=>m,popper:()=>u,popperGenerator:()=>kt,popperOffsets:()=>Et,preventOverflow:()=>At,read:()=>_,reference:()=>f,right:()=>s,start:()=>l,top:()=>i,variationPlacements:()=>p,viewport:()=>d,write:()=>A});var i="top",n="bottom",s="right",o="left",r="auto",a=[i,n,s,o],l="start",c="end",h="clippingParents",d="viewport",u="popper",f="reference",p=a.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+c])}),[]),m=[].concat(a,[r]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+c])}),[]),g="beforeRead",_="read",b="afterRead",v="beforeMain",y="main",w="afterMain",E="beforeWrite",A="write",T="afterWrite",C=[g,_,b,v,y,w,E,A,T];function O(t){return t?(t.nodeName||"").toLowerCase():null}function x(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function k(t){return t instanceof x(t).Element||t instanceof Element}function L(t){return t instanceof x(t).HTMLElement||t instanceof HTMLElement}function S(t){return"undefined"!=typeof ShadowRoot&&(t instanceof x(t).ShadowRoot||t instanceof ShadowRoot)}const D={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];L(s)&&O(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});L(n)&&O(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function $(t){return t.split("-")[0]}var I=Math.max,N=Math.min,P=Math.round;function M(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function j(){return!/^((?!chrome|android).)*safari/i.test(M())}function F(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&L(t)&&(s=t.offsetWidth>0&&P(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&P(n.height)/t.offsetHeight||1);var r=(k(t)?x(t):window).visualViewport,a=!j()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function H(t){var e=F(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function B(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&S(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function W(t){return x(t).getComputedStyle(t)}function z(t){return["table","td","th"].indexOf(O(t))>=0}function R(t){return((k(t)?t.ownerDocument:t.document)||window.document).documentElement}function q(t){return"html"===O(t)?t:t.assignedSlot||t.parentNode||(S(t)?t.host:null)||R(t)}function V(t){return L(t)&&"fixed"!==W(t).position?t.offsetParent:null}function Y(t){for(var e=x(t),i=V(t);i&&z(i)&&"static"===W(i).position;)i=V(i);return i&&("html"===O(i)||"body"===O(i)&&"static"===W(i).position)?e:i||function(t){var e=/firefox/i.test(M());if(/Trident/i.test(M())&&L(t)&&"fixed"===W(t).position)return null;var i=q(t);for(S(i)&&(i=i.host);L(i)&&["html","body"].indexOf(O(i))<0;){var n=W(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function K(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Q(t,e,i){return I(t,N(e,i))}function X(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function U(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const G={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,r=t.state,l=t.name,c=t.options,h=r.elements.arrow,d=r.modifiersData.popperOffsets,u=$(r.placement),f=K(u),p=[o,s].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return X("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:U(t,a))}(c.padding,r),g=H(h),_="y"===f?i:o,b="y"===f?n:s,v=r.rects.reference[p]+r.rects.reference[f]-d[f]-r.rects.popper[p],y=d[f]-r.rects.reference[f],w=Y(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=Q(T,O,C),k=f;r.modifiersData[l]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&B(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function J(t){return t.split("-")[1]}var Z={top:"auto",right:"auto",bottom:"auto",left:"auto"};function tt(t){var e,r=t.popper,a=t.popperRect,l=t.placement,h=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=o,C=i,O=window;if(p){var k=Y(r),L="clientHeight",S="clientWidth";k===x(r)&&"static"!==W(k=R(r)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===i||(l===o||l===s)&&h===c)&&(C=n,y-=(g&&k===O&&O.visualViewport?O.visualViewport.height:k[L])-a.height,y*=f?1:-1),l!==o&&(l!==i&&l!==n||h!==c)||(T=s,b-=(g&&k===O&&O.visualViewport?O.visualViewport.width:k[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&Z),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:P(i*s)/s||0,y:P(n*s)/s||0}}({x:b,y},x(r)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const et={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:$(e.placement),variation:J(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,tt(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,tt(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var it={passive:!0};const nt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=x(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,it)})),a&&l.addEventListener("resize",i.update,it),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,it)})),a&&l.removeEventListener("resize",i.update,it)}},data:{}};var st={left:"right",right:"left",bottom:"top",top:"bottom"};function ot(t){return t.replace(/left|right|bottom|top/g,(function(t){return st[t]}))}var rt={start:"end",end:"start"};function at(t){return t.replace(/start|end/g,(function(t){return rt[t]}))}function lt(t){var e=x(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ct(t){return F(R(t)).left+lt(t).scrollLeft}function ht(t){var e=W(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function dt(t){return["html","body","#document"].indexOf(O(t))>=0?t.ownerDocument.body:L(t)&&ht(t)?t:dt(q(t))}function ut(t,e){var i;void 0===e&&(e=[]);var n=dt(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=x(n),r=s?[o].concat(o.visualViewport||[],ht(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ut(q(r)))}function ft(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function pt(t,e,i){return e===d?ft(function(t,e){var i=x(t),n=R(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=j();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ct(t),y:l}}(t,i)):k(e)?function(t,e){var i=F(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ft(function(t){var e,i=R(t),n=lt(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=I(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=I(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ct(t),l=-n.scrollTop;return"rtl"===W(s||i).direction&&(a+=I(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(R(t)))}function mt(t){var e,r=t.reference,a=t.element,h=t.placement,d=h?$(h):null,u=h?J(h):null,f=r.x+r.width/2-a.width/2,p=r.y+r.height/2-a.height/2;switch(d){case i:e={x:f,y:r.y-a.height};break;case n:e={x:f,y:r.y+r.height};break;case s:e={x:r.x+r.width,y:p};break;case o:e={x:r.x-a.width,y:p};break;default:e={x:r.x,y:r.y}}var m=d?K(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case l:e[m]=e[m]-(r[g]/2-a[g]/2);break;case c:e[m]=e[m]+(r[g]/2-a[g]/2)}}return e}function gt(t,e){void 0===e&&(e={});var o=e,r=o.placement,l=void 0===r?t.placement:r,c=o.strategy,p=void 0===c?t.strategy:c,m=o.boundary,g=void 0===m?h:m,_=o.rootBoundary,b=void 0===_?d:_,v=o.elementContext,y=void 0===v?u:v,w=o.altBoundary,E=void 0!==w&&w,A=o.padding,T=void 0===A?0:A,C=X("number"!=typeof T?T:U(T,a)),x=y===u?f:u,S=t.rects.popper,D=t.elements[E?x:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ut(q(t)),i=["absolute","fixed"].indexOf(W(t).position)>=0&&L(t)?Y(t):t;return k(i)?e.filter((function(t){return k(t)&&B(t,i)&&"body"!==O(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=pt(t,i,n);return e.top=I(s.top,e.top),e.right=N(s.right,e.right),e.bottom=N(s.bottom,e.bottom),e.left=I(s.left,e.left),e}),pt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(k(D)?D:D.contextElement||R(t.elements.popper),g,b,p),P=F(t.elements.reference),M=mt({reference:P,element:S,strategy:"absolute",placement:l}),j=ft(Object.assign({},S,M)),H=y===u?j:P,z={top:$.top-H.top+C.top,bottom:H.bottom-$.bottom+C.bottom,left:$.left-H.left+C.left,right:H.right-$.right+C.right},V=t.modifiersData.offset;if(y===u&&V){var K=V[l];Object.keys(z).forEach((function(t){var e=[s,n].indexOf(t)>=0?1:-1,o=[i,n].indexOf(t)>=0?"y":"x";z[t]+=K[o]*e}))}return z}const _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,c=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=c.mainAxis,u=void 0===d||d,f=c.altAxis,g=void 0===f||f,_=c.fallbackPlacements,b=c.padding,v=c.boundary,y=c.rootBoundary,w=c.altBoundary,E=c.flipVariations,A=void 0===E||E,T=c.allowedAutoPlacements,C=e.options.placement,O=$(C),x=_||(O!==C&&A?function(t){if($(t)===r)return[];var e=ot(t);return[at(t),e,at(e)]}(C):[ot(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat($(i)===r?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,l=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?m:c,d=J(n),u=d?l?p:p.filter((function(t){return J(t)===d})):a,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var g=f.reduce((function(e,i){return e[i]=gt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[$(i)],e}),{});return Object.keys(g).sort((function(t,e){return g[t]-g[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,I=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=gt(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?s:o:F?n:i;L[B]>S[B]&&(z=ot(z));var R=ot(z),q=[];if(u&&q.push(W[j]<=0),g&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,I=!1;break}D.set(M,q)}if(I)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function bt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function vt(t){return[i,s,n,o].some((function(e){return t[e]>=0}))}const yt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=gt(e,{elementContext:"reference"}),a=gt(e,{altBoundary:!0}),l=bt(r,n),c=bt(a,s,o),h=vt(l),d=vt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},wt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,r=t.name,a=n.offset,l=void 0===a?[0,0]:a,c=m.reduce((function(t,n){return t[n]=function(t,e,n){var r=$(t),a=[o,i].indexOf(r)>=0?-1:1,l="function"==typeof n?n(Object.assign({},e,{placement:t})):n,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[o,s].indexOf(r)>=0?{x:h,y:c}:{x:c,y:h}}(n,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[r]=c}},Et={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=mt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},At={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,r=t.options,a=t.name,c=r.mainAxis,h=void 0===c||c,d=r.altAxis,u=void 0!==d&&d,f=r.boundary,p=r.rootBoundary,m=r.altBoundary,g=r.padding,_=r.tether,b=void 0===_||_,v=r.tetherOffset,y=void 0===v?0:v,w=gt(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=$(e.placement),A=J(e.placement),T=!A,C=K(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),P=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?i:o,B="y"===C?n:s,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[B],V=b?-L[W]/2:0,X=A===l?k[W]:L[W],U=A===l?-L[W]:-k[W],G=e.elements.arrow,Z=b&&G?H(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[B],nt=Q(0,k[W],Z[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:X-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&Y(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==P?void 0:P[C])?j:0,ct=z+ot-lt,ht=Q(b?N(R,z+st-lt-at):R,z,b?I(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?i:o,ft="x"===C?n:s,pt=x[O],mt="y"===O?"height":"width",_t=pt+w[ut],bt=pt-w[ft],vt=-1!==[i,o].indexOf(E),yt=null!=(dt=null==P?void 0:P[O])?dt:0,wt=vt?_t:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=Q(t,e,i);return n>i?i:n}(wt,pt,Et):Q(b?wt:_t,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Tt(t,e,i){void 0===i&&(i=!1);var n,s,o=L(e),r=L(e)&&function(t){var e=t.getBoundingClientRect(),i=P(e.width)/t.offsetWidth||1,n=P(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=R(e),l=F(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==O(e)||ht(a))&&(c=(n=e)!==x(n)&&L(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:lt(n)),L(e)?((h=F(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ct(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ct(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Ot={placement:"bottom",modifiers:[],strategy:"absolute"};function xt(){for(var t=arguments.length,e=new Array(t),i=0;i$t.has(t)&&$t.get(t).get(e)||null,remove(t,e){if(!$t.has(t))return;const i=$t.get(t);i.delete(e),0===i.size&&$t.delete(t)}},Nt="transitionend",Pt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),Mt=t=>{t.dispatchEvent(new Event(Nt))},jt=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ft=t=>jt(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Pt(t)):null,Ht=t=>{if(!jt(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Bt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),Wt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?Wt(t.parentNode):null},zt=()=>{},Rt=t=>{t.offsetHeight},qt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Vt=[],Yt=()=>"rtl"===document.documentElement.dir,Kt=t=>{var e;e=()=>{const e=qt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Vt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Vt)t()})),Vt.push(e)):e()},Qt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Xt=(t,e,i=!0)=>{if(!i)return void Qt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Nt,o),Qt(t))};e.addEventListener(Nt,o),setTimeout((()=>{s||Mt(e)}),n)},Ut=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Gt=/[^.]*(?=\..*)\.|.*/,Jt=/\..*/,Zt=/::\d+$/,te={};let ee=1;const ie={mouseenter:"mouseover",mouseleave:"mouseout"},ne=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function se(t,e){return e&&`${e}::${ee++}`||t.uidEvent||ee++}function oe(t){const e=se(t);return t.uidEvent=e,te[e]=te[e]||{},te[e]}function re(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function ae(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=de(t);return ne.has(o)||(o=t),[n,s,o]}function le(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=ae(e,i,n);if(e in ie){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=oe(t),c=l[a]||(l[a]={}),h=re(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=se(r,e.replace(Gt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return fe(s,{delegateTarget:r}),n.oneOff&&ue.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return fe(n,{delegateTarget:t}),i.oneOff&&ue.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function ce(t,e,i,n,s){const o=re(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function he(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&ce(t,e,i,r.callable,r.delegationSelector)}function de(t){return t=t.replace(Jt,""),ie[t]||t}const ue={on(t,e,i,n){le(t,e,i,n,!1)},one(t,e,i,n){le(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=ae(e,i,n),a=r!==e,l=oe(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))he(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(Zt,"");a&&!e.includes(s)||ce(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;ce(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=qt();let s=null,o=!0,r=!0,a=!1;e!==de(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=fe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function fe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function pe(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function me(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const ge={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${me(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${me(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=pe(t.dataset[n])}return e},getDataAttribute:(t,e)=>pe(t.getAttribute(`data-bs-${me(e)}`))};class _e{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=jt(e)?ge.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...jt(e)?ge.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=jt(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class be extends _e{constructor(t,e){super(),(t=Ft(t))&&(this._element=t,this._config=this._getConfig(e),It.set(this._element,this.constructor.DATA_KEY,this))}dispose(){It.remove(this._element,this.constructor.DATA_KEY),ue.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Xt(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return It.get(Ft(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ve=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?Pt(i.trim()):null}return e},ye={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Bt(t)&&Ht(t)))},getSelectorFromElement(t){const e=ve(t);return e&&ye.findOne(e)?e:null},getElementFromSelector(t){const e=ve(t);return e?ye.findOne(e):null},getMultipleElementsFromSelector(t){const e=ve(t);return e?ye.find(e):[]}},we=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;ue.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Bt(this))return;const s=ye.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ee=".bs.alert",Ae=`close${Ee}`,Te=`closed${Ee}`;class Ce extends be{static get NAME(){return"alert"}close(){if(ue.trigger(this._element,Ae).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),ue.trigger(this._element,Te),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Ce.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}we(Ce,"close"),Kt(Ce);const Oe='[data-bs-toggle="button"]';class xe extends be{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=xe.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}ue.on(document,"click.bs.button.data-api",Oe,(t=>{t.preventDefault();const e=t.target.closest(Oe);xe.getOrCreateInstance(e).toggle()})),Kt(xe);const ke=".bs.swipe",Le=`touchstart${ke}`,Se=`touchmove${ke}`,De=`touchend${ke}`,$e=`pointerdown${ke}`,Ie=`pointerup${ke}`,Ne={endCallback:null,leftCallback:null,rightCallback:null},Pe={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Me extends _e{constructor(t,e){super(),this._element=t,t&&Me.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Ne}static get DefaultType(){return Pe}static get NAME(){return"swipe"}dispose(){ue.off(this._element,ke)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Qt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Qt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(ue.on(this._element,$e,(t=>this._start(t))),ue.on(this._element,Ie,(t=>this._end(t))),this._element.classList.add("pointer-event")):(ue.on(this._element,Le,(t=>this._start(t))),ue.on(this._element,Se,(t=>this._move(t))),ue.on(this._element,De,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const je=".bs.carousel",Fe=".data-api",He="next",Be="prev",We="left",ze="right",Re=`slide${je}`,qe=`slid${je}`,Ve=`keydown${je}`,Ye=`mouseenter${je}`,Ke=`mouseleave${je}`,Qe=`dragstart${je}`,Xe=`load${je}${Fe}`,Ue=`click${je}${Fe}`,Ge="carousel",Je="active",Ze=".active",ti=".carousel-item",ei=Ze+ti,ii={ArrowLeft:ze,ArrowRight:We},ni={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},si={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class oi extends be{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=ye.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===Ge&&this.cycle()}static get Default(){return ni}static get DefaultType(){return si}static get NAME(){return"carousel"}next(){this._slide(He)}nextWhenVisible(){!document.hidden&&Ht(this._element)&&this.next()}prev(){this._slide(Be)}pause(){this._isSliding&&Mt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?ue.one(this._element,qe,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void ue.one(this._element,qe,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?He:Be;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&ue.on(this._element,Ve,(t=>this._keydown(t))),"hover"===this._config.pause&&(ue.on(this._element,Ye,(()=>this.pause())),ue.on(this._element,Ke,(()=>this._maybeEnableCycle()))),this._config.touch&&Me.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of ye.find(".carousel-item img",this._element))ue.on(t,Qe,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(We)),rightCallback:()=>this._slide(this._directionToOrder(ze)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new Me(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=ii[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=ye.findOne(Ze,this._indicatorsElement);e.classList.remove(Je),e.removeAttribute("aria-current");const i=ye.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Je),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===He,s=e||Ut(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>ue.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Re).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),Rt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(Je),i.classList.remove(Je,c,l),this._isSliding=!1,r(qe)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return ye.findOne(ei,this._element)}_getItems(){return ye.find(ti,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Yt()?t===We?Be:He:t===We?He:Be}_orderToDirection(t){return Yt()?t===Be?We:ze:t===Be?ze:We}static jQueryInterface(t){return this.each((function(){const e=oi.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}ue.on(document,Ue,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=ye.getElementFromSelector(this);if(!e||!e.classList.contains(Ge))return;t.preventDefault();const i=oi.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===ge.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),ue.on(window,Xe,(()=>{const t=ye.find('[data-bs-ride="carousel"]');for(const e of t)oi.getOrCreateInstance(e)})),Kt(oi);const ri=".bs.collapse",ai=`show${ri}`,li=`shown${ri}`,ci=`hide${ri}`,hi=`hidden${ri}`,di=`click${ri}.data-api`,ui="show",fi="collapse",pi="collapsing",mi=`:scope .${fi} .${fi}`,gi='[data-bs-toggle="collapse"]',_i={parent:null,toggle:!0},bi={parent:"(null|element)",toggle:"boolean"};class vi extends be{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=ye.find(gi);for(const t of i){const e=ye.getSelectorFromElement(t),i=ye.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return _i}static get DefaultType(){return bi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>vi.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(ue.trigger(this._element,ai).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(fi),this._element.classList.add(pi),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(pi),this._element.classList.add(fi,ui),this._element.style[e]="",ue.trigger(this._element,li)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(ue.trigger(this._element,ci).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,Rt(this._element),this._element.classList.add(pi),this._element.classList.remove(fi,ui);for(const t of this._triggerArray){const e=ye.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(pi),this._element.classList.add(fi),ue.trigger(this._element,hi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(ui)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ft(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(gi);for(const e of t){const t=ye.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=ye.find(mi,this._config.parent);return ye.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=vi.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}ue.on(document,di,gi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of ye.getMultipleElementsFromSelector(this))vi.getOrCreateInstance(t,{toggle:!1}).toggle()})),Kt(vi);const yi="dropdown",wi=".bs.dropdown",Ei=".data-api",Ai="ArrowUp",Ti="ArrowDown",Ci=`hide${wi}`,Oi=`hidden${wi}`,xi=`show${wi}`,ki=`shown${wi}`,Li=`click${wi}${Ei}`,Si=`keydown${wi}${Ei}`,Di=`keyup${wi}${Ei}`,$i="show",Ii='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Ni=`${Ii}.${$i}`,Pi=".dropdown-menu",Mi=Yt()?"top-end":"top-start",ji=Yt()?"top-start":"top-end",Fi=Yt()?"bottom-end":"bottom-start",Hi=Yt()?"bottom-start":"bottom-end",Bi=Yt()?"left-start":"right-start",Wi=Yt()?"right-start":"left-start",zi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ri={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class qi extends be{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=ye.next(this._element,Pi)[0]||ye.prev(this._element,Pi)[0]||ye.findOne(Pi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return zi}static get DefaultType(){return Ri}static get NAME(){return yi}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Bt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!ue.trigger(this._element,xi,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))ue.on(t,"mouseover",zt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add($i),this._element.classList.add($i),ue.trigger(this._element,ki,t)}}hide(){if(Bt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!ue.trigger(this._element,Ci,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.off(t,"mouseover",zt);this._popper&&this._popper.destroy(),this._menu.classList.remove($i),this._element.classList.remove($i),this._element.setAttribute("aria-expanded","false"),ge.removeDataAttribute(this._menu,"popper"),ue.trigger(this._element,Oi,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!jt(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${yi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:jt(this._config.reference)?t=Ft(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=St(t,this._menu,i)}_isShown(){return this._menu.classList.contains($i)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Bi;if(t.classList.contains("dropstart"))return Wi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ji:Mi:e?Hi:Fi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(ge.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Qt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=ye.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Ht(t)));i.length&&Ut(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=ye.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ai,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:ye.prev(this,Ii)[0]||ye.next(this,Ii)[0]||ye.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}ue.on(document,Si,Ii,qi.dataApiKeydownHandler),ue.on(document,Si,Pi,qi.dataApiKeydownHandler),ue.on(document,Li,qi.clearMenus),ue.on(document,Di,qi.clearMenus),ue.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),Kt(qi);const Vi="backdrop",Yi="show",Ki=`mousedown.bs.${Vi}`,Qi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Xi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends _e{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Qi}static get DefaultType(){return Xi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void Qt(t);this._append();const e=this._getElement();this._config.isAnimated&&Rt(e),e.classList.add(Yi),this._emulateAnimation((()=>{Qt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Yi),this._emulateAnimation((()=>{this.dispose(),Qt(t)}))):Qt(t)}dispose(){this._isAppended&&(ue.off(this._element,Ki),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ft(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),ue.on(t,Ki,(()=>{Qt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Xt(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends _e{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),ue.off(document,Gi),ue.on(document,Ji,(t=>this._handleFocusin(t))),ue.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,ue.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=ye.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&ge.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=ge.getDataAttribute(t,e);null!==i?(ge.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(jt(t))e(t);else for(const i of ye.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",En="show",An="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends be{constructor(t,e){super(t,e),this._dialog=ye.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||ue.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(ue.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(En),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){ue.off(window,hn),ue.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=ye.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),Rt(this._element),this._element.classList.add(En),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,ue.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){ue.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),ue.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),ue.on(this._element,bn,(t=>{ue.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),ue.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(ue.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(An)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(An),this._queueCallback((()=>{this._element.classList.remove(An),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Yt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Yt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}ue.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=ye.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),ue.one(e,pn,(t=>{t.defaultPrevented||ue.one(e,fn,(()=>{Ht(this)&&this.focus()}))}));const i=ye.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),we(On),Kt(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Bn=`click${xn}${kn}`,Wn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends be{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||ue.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),ue.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(ue.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),ue.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():ue.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){ue.on(this._element,Wn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():ue.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}ue.on(document,Bn,'[data-bs-toggle="offcanvas"]',(function(t){const e=ye.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Bt(this))return;ue.one(e,Fn,(()=>{Ht(this)&&this.focus()}));const i=ye.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),ue.on(window,Ln,(()=>{for(const t of ye.find(In))qn.getOrCreateInstance(t).show()})),ue.on(window,Hn,(()=>{for(const t of ye.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),we(qn),Kt(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Yn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Kn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Qn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Yn.has(i)||Boolean(Kn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Xn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends _e{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Xn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=ye.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?jt(e)?this._putElementInTemplate(Ft(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Qn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Qt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:Yt()?"left":"right",BOTTOM:"bottom",LEFT:Yt()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends be{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),ue.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=ue.trigger(this._element,this.constructor.eventName("show")),e=(Wt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),ue.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.on(t,"mouseover",zt);this._queueCallback((()=>{ue.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!ue.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.off(t,"mouseover",zt);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),ue.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=Qt(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return St(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Qt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Qt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)ue.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");ue.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),ue.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},ue.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=ge.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ft(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Kt(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Kt(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Es={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class As extends be{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return Es}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ft(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(ue.off(this._config.target,ms),ue.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=ye.find(bs,this._config.target);for(const e of t){if(!e.hash||Bt(e))continue;const t=ye.findOne(decodeURI(e.hash),this._element);Ht(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),ue.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))ye.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of ye.parents(t,".nav, .list-group"))for(const t of ye.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=ye.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=As.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}ue.on(window,gs,(()=>{for(const t of ye.find('[data-bs-spy="scroll"]'))As.getOrCreateInstance(t)})),Kt(As);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Bs="show",Ws=".dropdown-toggle",zs=`:not(${Ws})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ys extends be{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),ue.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?ue.trigger(e,Cs,{relatedTarget:t}):null;ue.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(ye.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),ue.trigger(t,ks,{relatedTarget:e})):t.classList.add(Bs)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(ye.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),ue.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Bs)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Bt(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=Ut(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ys.getOrCreateInstance(i).show())}_getChildren(){return ye.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=ye.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=ye.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ws,Fs),n(".dropdown-menu",Bs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:ye.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ys.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}ue.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Bt(this)||Ys.getOrCreateInstance(this).show()})),ue.on(window,Ds,(()=>{for(const t of ye.find(Vs))Ys.getOrCreateInstance(t)})),Kt(Ys);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Us=`focusin${Ks}`,Gs=`focusout${Ks}`,Js=`hide${Ks}`,Zs=`hidden${Ks}`,to=`show${Ks}`,eo=`shown${Ks}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends be{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){ue.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),Rt(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),ue.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(ue.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),ue.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){ue.on(this._element,Qs,(t=>this._onInteraction(t,!0))),ue.on(this._element,Xs,(t=>this._onInteraction(t,!1))),ue.on(this._element,Us,(t=>this._onInteraction(t,!0))),ue.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function lo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}we(ao),Kt(ao),lo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new cs(t,{delay:{show:500,hide:100}})}))})),lo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),lo((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))}))})(); -//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/docs/_static/scripts/bootstrap.js.LICENSE.txt b/docs/_static/scripts/bootstrap.js.LICENSE.txt deleted file mode 100644 index 10f979d0..00000000 --- a/docs/_static/scripts/bootstrap.js.LICENSE.txt +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ diff --git a/docs/_static/scripts/bootstrap.js.map b/docs/_static/scripts/bootstrap.js.map deleted file mode 100644 index e5bc1575..00000000 --- a/docs/_static/scripts/bootstrap.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.2';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? parseSelector(hrefAttribute.trim()) : null;\n }\n return selector;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\n\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\n\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' + '
' + '
' + '
',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' + '
' + '

' + '
' + '
',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both